Bitwertigkeit
# Bitwertigkeit

Die Bitwertigkeit legt den Stellenwert eines einzelnen Bits fest, den es durch seine Position innerhalb einer Binärzahl (auch Dualzahl genannt) haben soll. Sie beginnt mit $2^{0}=1$ und steigt je Position/Stelle um jeweils eine Zweierpotenz an.
Bei der Adressierung im Speicher werden die Bitwertigkeiten über die Bitnummerierung definiert.
Im Rahmen der Signalübertragung legt die Bitreihenfolge die Wertigkeit jedes Bits fest.
Unabhängig hiervon ist die Byte-Reihenfolge und kommt erst bei Dualzahlen mit mehr als acht Bit (einem Byte) Wortbreite zu tragen.

## Bitreihenfolge

Bei der hardwarenahen Programmierung von Mikroprozessoren und bei der seriellen Datenübertragung (bitweisen Datenübertragung) spielt die Reihenfolge der Bits eines Datenwortes eine entscheidende Rolle bezüglich dessen Wertes. Sie beginnt entweder mit der niedrigsten oder höchsten Wertigkeit (englisch significance):
* LSb-first (Least Significant Bit first): Die Reihenfolge beginnt mit dem niedrigstwertigen Bit.
* MSb-first (Most Significant Bit first): Die Reihenfolge beginnt mit dem höchstwertigen Bit.

## Notation und Nummerierung

Bei der Notation einer Dualzahl als Reihung von 0 und 1 hingegen, werden typischerweise die Bit-Stellen gemäß ihrer aufsteigenden Wertigkeit horizontal von rechts nach links aufgetragen. Somit steht die Ziffer mit der höchsten Wertigkeit am linken Ende der Reihe.
Für die Addressierbarkeit der Stellen zum Beispiel innerhalb eines 8-Bit-Registers bedient man sich allerdings der Nummerierung oder Indizierung der Bit-Stellen und auch sie kann entweder mit der niedrigsten oder höchsten Wertigkeit beginnen:
* Beginnt die Nummerierung mit 0 für das niedrigstwertige Bit (LSb) auf der rechten Seite und läuft nach links, so spricht man von „LSb$_0$“.
* Beginnt die Nummerierung mit 0 für das höchstwertige Bit (MSb) auf der linken Seite und läuft nach rechts, so spricht man von „MSb$_0$“.

### LSb$_0$-Bitnummerierung

| 150$_{dez}$ in LSb$_0$ | MSb | | | | | | | LSb |
| Bitnummer | 7 | | | | | | | 0 |
| Bitwertigkeit | $2^{7}$ 128 | $2^{6}$ 64 | $2^{5}$ 32 | $2^{4}$ 16 | $2^{3}$ 8 | $2^{2}$ 4 | $2^{1}$ 2 | $2^{0}$ 1 |
| Inhalt des Bit | 1 | 0 | 0 | 1 | 0 | 1 | 1 | 0 |
Sind die Bits innerhalb einer Binärzahl gemäß LSb$_0$ nummeriert, dann hat das Bit mit dem niedrigsten Stellenwert (englisch least significant bit) die Nummer 0 (= ist das Bit mit dem Index 0).
Ist bei einer Binärzahl mit den Stellen $0,1,\ldots ,N-1$ die Bitposition 0 die niedrigstwertige, dann ist deren Wert mit $1$ zu multiplizieren. Der Gesamtwert der Binärzahl ist:
    $\sum _{i=0}^{N-1}a_{i}\cdot 2^{i}$

### MSb$_0$-Bitnummerierung

| 150$_{dez}$ in MSb$_0$ | MSb | | | | | | | LSb |
| Bitnummer | 0 | | | | | | | 7 |
| Bitwertigkeit | $2^{7-0}$ 128 | $2^{7-1}$ 64 | $2^{7-2}$ 32 | $2^{7-3}$ 16 | $2^{7-4}$ 8 | $2^{7-5}$ 4 | $2^{7-6}$ 2 | $2^{7-7}$ 1 |
| Inhalt des Bit | 1 | 0 | 0 | 1 | 0 | 1 | 1 | 0 |
Sind die Bits innerhalb einer Binärzahl gemäß MSb$_0$ nummeriert, dann hat das Bit mit dem höchsten Stellenwert (englisch most significant bit) die Nummer 0 (= ist das Bit mit dem Index 0).
Ist bei einer Binärzahl mit den Positionen $0,1,\ldots ,N-1$ die Bitposition 0 die höchstwertige, dann ist deren Wert mit $2^{N-1}$ zu multiplizieren. Der Gesamtwert der Binärzahl ist:
    $\sum _{i=0}^{N-1}a_{i}\cdot 2^{N-1-i}$

## Zahlenformat und Vorzeichenbit

Das höchstwertige Bit (MSb) zeigt im Einerkomplement, Zweierkomplement und anderen Zahlenformaten mit Vorzeichenbit auch an, ob die entsprechende Dezimalzahl positiv oder negativ ist. Beim Zweierkomplement zählt die Null dabei zu den nicht-negativen Zahlen, sodass man mehr negative als positive Zahlen darstellen kann. Bei anderen Zahlenformaten wie dem Einerkomplement oder Gleitkommazahlen nach IEEE-754-Standard gibt es zwei Darstellungen der Null (+0 und −0).

## Adressierung von Bits

Dieselben Annahmen wie im Artikel „Byte-Reihenfolge“ seien vorausgesetzt.
Für die meisten in der Praxis verwendeten Rechner besteht die kleinste adressierbare Einheit aus mehr als einem Bit, z. B. aus einem Byte, das 8 Bits enthält. Mithin lässt sich ein einzelnes Bit nicht unmittelbar adressieren.
Fügt man einer Byte-Adresse jedoch ein Bit-Offset BitOffset ∈ 0,1, …,7 bei, so wird ein einzelnes Bit eindeutig spezifizierbar. Diese Art der Spezifikation wird Bit-Adressierung genannt. Sie lässt sich über den Umweg von Registerverschiebungen verwirklichen.
Die Begriffe links/rechts haben bei solchen Shift-Befehlen nichts mit links/rechts wie weiter oben beschrieben zu tun, sondern orientieren sich ausschließlich an der üblichen Sicht:
* der Links-Shift multipliziert eine Binärzahl mit einer Zweierpotenz, verschiebt die Bits also in Richtung „Big-End“ (= Richtung most significant bit)
* der Rechts-Shift umgekehrt.
In der Form ByteAdresse * 8 + BitOffset hat die Bit-Adressierung folgende Eigenschaften:
| Adress- Inkrement | Links -Shift | Rechts -Shift |
| Big-Endian | –1 | +1 |
| Little-Endian | +1 | –1 |
* Abgesehen von den Effekten an den beiden Rändern des Registers, bedeutet eine Shift-Operation um 1 Bit eine Veränderung der Bit-Adresse um 1 (genauer: einen Transport der Bitkette an eine um 1 veränderte Bitadresse), und zwar entspricht (vgl. Tabelle):
** ein Links-Shift bei Big-Endian einer Verringerung um 1,
** ein Rechts-Shift bei Big-Endian einer Erhöhung um 1,
** ein Links-Shift bei Little-Endian einer Erhöhung um 1,
** ein Rechts-Shift bei Little-Endian einer Verringerung um 1.
* Unmittelbar erkennbar wird dies bei Shifts um Vielfache von 8 Bits: Eine Shift-Operation um 8 Bit ist dasselbe wie 8 Shift-Operationen um 1 Bit in immer die gleiche Richtung. Von den Randeffekten abgesehen bedeutet ein Shift um 8 Bit eine Veränderung der Byte-Adresse um 1 (Verringerung / Erhöhung wie oben bei einzelnen Bits). Damit aber eine Shift-Operation um 8 Bit nicht nur aus Randeffekten besteht, muss das Register breiter als 8 Bit sein.

### Ergebnis

* Die Unterscheidbarkeit der Bits lässt sich abbilden auf eine eindeutige Adressierung (Nummerierung) derselben, bspw. in der exemplarischen Form ByteAdresse * 8 + BitOffset . Der Zugriff auf ein einzelnes Bit gelingt (nach entsprechender Isolierung durch bitweise Operationen) unter Zuhilfenahme von Shift-Operationen. Rechts- wie Links-Shift führen (auf ein und demselben Computer) beide zum exakt gleichen Ergebnis. Dabei wird die Endianness (Big oder Little) der Bytes im Wort auf eine der Bits im Byte übertragen. Die Shift-Operationen stellen unter dieser Adressierung Transporte von Bits dar um die im Shift angegebene Anzahl von Bit-Positionen.
Platziert man in der horizontalen Darstellung die niedrigen Adressen links und die hohen rechts, so lassen sich für 32 Bit (d. h. 4 Byte) lange Bit-Arrays oder vorzeichenlose Ganzzahlen die Konventionen der Bit-Nummerierung folgendermaßen gegenüberstellen:
| Aufsteigende Offsets | Byte-Offset | 0 | 1 | 2 | 3 |
| Aufsteigende Offsets | Bit-Offset | 0, 1, …, 7 | 0, 1, …, 7 | 0, 1, …, 7 | 0, 1, …, 7 |
| Bitnummer bei Big-Endian und | MSb$_0$ | 0, 1, …, 7 | 08, …, 15 | 16, …, 23 | 24, …, 31 |
| Bitnummer bei Big-Endian und | LSb$_0$ | 31, …, 24 | 23, …, 16 | 15, …, 08 | 7, …, 1, 0 |
| Bitnummer bei Little-Endian und | LSb$_0$ | 0, 1, …, 7 | 08, …, 15 | 16, …, 23 | 24, …, 31 |
| Bitnummer bei Little-Endian und | MSb$_0$ | 31, …, 24 | 23, …, 16 | 15, …, 08 | 7, …, 1, 0 |
Die Nummerierung der Bits bei Big-Endian mit MSb$_0$ und Little-Endian mit LSb$_0$ (beide farblich unterlegt) entspricht somit der Bit-Adresse. Dagegen nummerieren die Konventionen LSb$_0$ bei Big-Endian und MSb$_0$ bei Little-Endian die Bits im Register gegenläufig zu ihrer Adresse, was mit einer (mit den Adressen aufsteigenden) Indizierung in einem Array antikorreliert.