Forum: Mikrocontroller und Digitale Elektronik Bitnummerierung - Gibt es eine Regel?


von Udo (Gast)


Lesenswert?

Hallo Forum,

Angenommen, ich habe eine Variable vom Typ uint16 und jedes Bit
hat eine eigenständige Bedeutung - also 16 Flags.

Ist euch eine Norm / offizielle Regel bekannt, die festlegt, ob das 
niederwertigste Bit als Bit 0 oder Bit 1 bezeichnet?

0x0001 - Ist hier nun Bit 1 oder Bit 0 gesetzt?

Wenn ich es von der Shift-Operation her betrachte, würde ich es logisch 
finden, es Bit 0 zu nennen:
uint16_var = (1<<0); //ergibt 0x0001

Der Nicht-Entwickler, also Anwender, der eine Doku liest, würde sich 
vermutlich wundern, wenn von Bit 0 die Rede ist. Aberd auch unter 
Entwicklern (meine Erfahrung) vergewissert man sich, dass alle 
Gesprächspartner von der  gleichen Zählweise sprechen.

von Wolfgang (Gast)


Lesenswert?

Udo schrieb:
> Ist euch eine Norm / offizielle Regel bekannt, die festlegt, ob das
> niederwertigste Bit als Bit 0 oder Bit 1 bezeichnet?
>
> 0x0001 - Ist hier nun Bit 1 oder Bit 0 gesetzt?

Wie du das Bit nennst, ist völlig egal. Bei dem Bitmuster 0x0001 ist das 
niederwertigste Bit gesetzt, egal ob du es "Bit 0" oder "Bit 1" nennst.

Namen sind Schall und Rauch. Mach es genauso wie im Datenblatt.

von Bitverdreher (Gast)


Lesenswert?

Ich würde die Zählweise 0-15 ganz klar bevorzugen aber ob es hier eine 
feststehende Regel gibt, weiß ich nicht... bezweifle ich auch.

Aber zu Deinen Argumenten:
Ein Laie, der eine Doku liest und absolut nichts damit anfangen kann, 
wenn man mit 0 zu zählen beginnt, sollte sich sowieso erstmal mit ein 
paar Grundlagen vertraut machen. Jeder andere wird mit beiden Zählweisen 
zurechtkommen.

von Holger (Gast)


Lesenswert?

Udo schrieb:
> Hallo Forum,
>
> Angenommen, ich habe eine Variable vom Typ uint16 und jedes Bit
> hat eine eigenständige Bedeutung - also 16 Flags.

Dann gibst du deinen Flags aussagekräftige Namen, und nennst sie 
hoffentlich nicht nur Bit X.

> Ist euch eine Norm / offizielle Regel bekannt, die festlegt, ob das
> niederwertigste Bit als Bit 0 oder Bit 1 bezeichnet?

Schau einfach mal in die Datenblätter diverser uCs, da fängt die 
Bitnumerierung z.B. bei Registern in den allermeisten Fällen mit Bit 0 
an.

von (prx) A. K. (prx)


Lesenswert?

Udo schrieb:
> Norm / offizielle Regel

Nur etwas innere Logik.

Wirklich interessant wird es erst, wenn es Befehle gibt, die Bits 
adressieren können, oder gar Bitfelder. Davor ist es reine Konvention.

Bissel komplizierter wird die Affäre nämlich, wenn die Bytes in 
Speicherworten von links nach rechts durchnummeriert werden. Man kann es 
dann richtig machen, in dem man links mit 0 anfängt, wie beim PowerPC. 
Das passt zwar nicht zur Bitwertigkeit im Dualsystem, dafür aber erlebt 
man keine Überraschungen, wenn man Register und Speicher mit 
unterschiedlichen Breiten betrachtet. Man kann es auch falsch machen, 
wie beim 68000, wie sich bei dessen Weiterentwicklung zeigte.

von (prx) A. K. (prx)


Lesenswert?

Udo schrieb:
> 0x0001 - Ist hier nun Bit 1 oder Bit 0 gesetzt?
  0x1000 - Ist hier nun Bit 12, Bit 1000 oder Bit 4096 gesetzt?

Vielleicht doch die Bitwertigkeit 2^0, 2^1, ... 2^15?

: Bearbeitet durch User
von PittyJ (Gast)


Lesenswert?

Ich mache das jetzt schon ein paar Jahrzehnte.
Und das ist immer Bit 0. In allen Datenblättern. In alle 
Programmdokumentationen.
Ein Byte hat immer Bit 0 bis Bit 7. Und Bit 0 ist immer 2^0.

Und wenn es Ausnahmen gibt, z.B. Adressbit bei I2C, welches noch im 1 
geschoben werden muss, dann macht das auch immer Probleme.

von Rolf M. (rmagnus)


Lesenswert?

Wolfgang schrieb:
> Wie du das Bit nennst, ist völlig egal. Bei dem Bitmuster 0x0001 ist das
> niederwertigste Bit gesetzt, egal ob du es "Bit 0" oder "Bit 1" nennst.

Und wie würdest du es beim Bitmuster 0x0200 bezeichnen? Das 
zehntniederwertigste Bit? Man muss ja alle Bits benennen können und 
nicht nur das unterste.

Bitverdreher schrieb:
> Ich würde die Zählweise 0-15 ganz klar bevorzugen aber ob es hier eine
> feststehende Regel gibt, weiß ich nicht... bezweifle ich auch.

Sehe ich genauso.

: Bearbeitet durch User
von HildeK (Gast)


Lesenswert?

Udo schrieb:
> Ist euch eine Norm / offizielle Regel bekannt, die festlegt, ob das
> niederwertigste Bit als Bit 0 oder Bit 1 bezeichnet?
Eine Norm ist mir auch nicht bekannt.

> 0x0001 - Ist hier nun Bit 1 oder Bit 0 gesetzt?
Für mein Verständnis ist Bit 0 gesetzt. Auch, weil in der von mir 
verwendeten Programmiersprache und Hardware das so üblich ist.
Auch, weil die dezimale Wertigkeit des Bytes dann 2^0 ist.

> Wenn ich es von der Shift-Operation her betrachte, würde ich es logisch
> finden, es Bit 0 zu nennen:
> uint16_var = (1<<0); //ergibt 0x0001
Hier in der Anweisung direkt die '0' zu schreiben, ist eher unüblich. 
Verständlicher bleibt es, wenn man dafür einen Namen verwendet:
1
  #define LED 0
2
  var = (1<<LED); // ergibt auch 0x0001 :-)

> Aberd auch unter
> Entwicklern (meine Erfahrung) vergewissert man sich, dass alle
> Gesprächspartner von der  gleichen Zählweise sprechen.
Das ist in keinem Zusammenhang ein Fehler! Oft spricht man trotzdem vom 
"ersten Bit", ist man genauer, vom LSB bzw. niederwertigsten Bit.

Der Nichtentwickler braucht halt eine Legende in der Beschreibung, wie 
welche Begriffe verwendet werden. Auch das sollte nicht fehlen.

von Dergute W. (derguteweka)


Lesenswert?

Moin,

Bei Powerpc Prozessoren ist's mein' ich genau andersrum. Also Bit0 ist 
das MSB, Bit31 das LSB. Keine Regel ohne Ausnahme, und endlich noch viel 
mehr Spass bei der HW-Entwicklung.

Gruss
WK

von Wolfgang (Gast)


Lesenswert?

Rolf M. schrieb:
> Und wie würdest du es beim Bitmuster 0x0200 bezeichnen? Das
> zehntniederwertigste Bit?

Gar nicht. Da würde ich eine Abbildung der Registerinhalte zeigen oder 
die Struktur zeigen, wo die Bits sinntragend benannt sind. Dazu gibt es 
einen Header File, wo die erforderlichen Defines drin stehen.
Ein Bit wird dann durch <Variablenname>:<Bitbezeichnung> angesprochen.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Mit Abstand am verbreitetsten ist die LSB-0-Nummerierung, d.h. das
niederwertigste Bit hat die Nummer 0. Die Nummern entsprechen damit dem
Zweierlogarithmus der Wertigkeit des jeweiligen Bits in der Darstellung
von Integer-Zahlen, und eine Bitmaske kann in C und verwandten Sprachen
einfach mit 1<<bitnummer erzeugt werden.

Ausnahmen:

- MSB-0 bei einigen Prozessorfamilien mit Big-Endian-Zahlendarstellung
  (s. Beitrag von A. K.)

- MSB-1 beim ELEM-Operator in Algol 68

Algol ist aber so gut wie tot, und auch Big-Endian-Prozessoren kommen
immer mehr aus der Mode.


Wolfgang schrieb:
> Da würde ich eine Abbildung der Registerinhalte zeigen oder
> die Struktur zeigen, wo die Bits sinntragend benannt sind.

Was machst du, wenn du die einzelnen Bits eines I/O-Registers jemandem
am Telefon erklären möchtest? ;-)

von Stefan F. (Gast)


Lesenswert?

Ich kenne das auch nur so, dass an die Bits beginnend mit "0" durch 
nummeriert. Je nach Hardware mal von rechts nach links, oder von links 
nach rechts. Bei Seriellen Schnittstellen gibt beide Reihenfolgen (Bit 0 
zuerst oder zuletzt).

Wie dem auch sei, bei 0x0001 ist das Bit 0 gesetzt. Das ist für mich 
eindeutig, anders habe ich ich noch nirgendwo gesehen.

von Wolfgang (Gast)


Lesenswert?

Yalu X. schrieb:
> Was machst du, wenn du die einzelnen Bits eines I/O-Registers jemandem
> am Telefon erklären möchtest? ;-)

Eine Email oder Sonstwas schicken ;-)
Für manche Inhalte ist gesprochene Sprache ein unnötig kompliziertes und 
ungenaues Medium.

von mIstA (Gast)


Lesenswert?

Udo schrieb:
> Ist euch eine Norm / offizielle Regel bekannt, die festlegt, ob das
> niederwertigste Bit als Bit 0 oder Bit 1 bezeichnet?

Die einzige Regel, die mir dazu einfällt ist, daß man sich niemals, 
wirklich niemals, gedankenlos darauf verlassen sollte, daß es dafür eine 
Regel gäbe; ganz analog zu der recht ähnlichen Frage, ob man Schleifen 
besser von 0 oder von 1 loszählen lassen sollte.

Ich denke in der freien Wildbahn findet man (gerade wenns um die 
Aufschlüsselung von Flag-Worten geht) fast ausschließlich die Bit0 
Variante und über die mit Bit1 beginnende Variante stolpert man 
vermutlich am ehesten in extrem prosalastigen Flag-Beschreibungen. 
Außerdem wird natürlich auch wenn man beim Zählen der Bits mit 0 
beginnt, das Bit0 trotzdem als das erste Bit bezeichnet.


Udo schrieb:
> Aberd auch unter
> Entwicklern (meine Erfahrung) vergewissert man sich, dass alle
> Gesprächspartner von der  gleichen Zählweise sprechen.

Da stimme ich Dir uneingeschränkt zu; das zu Beginn kurz klarzustellen 
ist den (vernachlässigbaren) Aufwand in jedem Fall wert, selbst wenns 
nur in einem von 50 oder 100 Fällen ein tatsächliches Mißverständnis 
verhindert.


Udo schrieb:
> Angenommen, ich habe eine Variable vom Typ uint16 und jedes Bit
> hat eine eigenständige Bedeutung - also 16 Flags.

dann ist es grundsätzlich ohnehin viel besser, die Bits aussagekräftig 
zu benennen anstatt sie nur zu nummerieren. ;)



P.S.: Während des Schreibens hab ich mich jetzt doch noch an eine Regel 
aus längst vergangenen Zeiten erinnert. Damals hieß es, daß die Variante 
mit Bit1 zu beginnen hauptsächlich unter Mathematikern verbreitet wäre, 
während Informatiker fast ausschließlich die Bit0 Variante verwenden; 
stammt wie gesagt noch aus einer Zeit, als sich ein eigenständiges 
Informatikstudium gerade erst an den Unis etabliert gehabt hatte.

von mIstA (Gast)


Lesenswert?

Wolfgang schrieb:
> Yalu X. schrieb:
>> Was machst du, wenn du die einzelnen Bits eines I/O-Registers jemandem
>> am Telefon erklären möchtest? ;-)
>
> Eine Email oder Sonstwas schicken ;-)
> Für manche Inhalte ist gesprochene Sprache ein unnötig kompliziertes und
> ungenaues Medium.

Genau so ist es. Zumindest um die funktionale Zuordnung der einzelnen 
Bits zu kommunizieren ist eine vorab (per Mail oder Messenger) 
übermittelte Tabelle oder Grafik das absolut überlegenste Medium; die 
Details der einzelnen Funktionen können ja dann durchaus mündlich am 
Telefon besprochen bzw. diskutiert werden.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.