
Zahlensysteme und Bitoperationen — Vollständiger Leitfaden
Basisumrechnung, Bitmasken, Zweierkomplement, Ganzzahlbereiche und Registeroperationen anhand von Beispielen aus eingebetteten Systemen verstehen.
Mit dem Zahlensystem-Konverter lassen sich die folgenden Beispiele nachrechnen. Binär, dezimal, hexadezimal und oktal beschreiben denselben ganzzahligen Wert. Binärdarstellung eignet sich für Logikzustände und Register; Hexadezimaldarstellung für Bytes und Adressen; Dezimaldarstellung für Messwerte; Oktaldarstellung für Dreiergruppen und Berechtigungsmasken.
1. Basen und Stellenwert
Basis 2 verwendet 0–1, Basis 8 die Ziffern 0–7, Basis 10 die Ziffern 0–9 und Basis 16 zusätzlich A–F. Dabei gilt A = 10 und F = 15. Für Ziffern dᵢ zur Basis b gilt N = Σ dᵢ × bⁱ, mit i = 0 rechts. Führende Nullen verändern den Wert nicht, können aber die Registerbreite zeigen.
| DEC | BIN | HEX | OCT |
|---|---|---|---|
| 0 | 0000 | 0 | 0 |
| 1 | 0001 | 1 | 1 |
| 2 | 0010 | 2 | 2 |
| 3 | 0011 | 3 | 3 |
| 4 | 0100 | 4 | 4 |
| 5 | 0101 | 5 | 5 |
| 6 | 0110 | 6 | 6 |
| 7 | 0111 | 7 | 7 |
| 8 | 1000 | 8 | 10 |
| 9 | 1001 | 9 | 11 |
| 10 | 1010 | A | 12 |
| 11 | 1011 | B | 13 |
| 12 | 1100 | C | 14 |
| 13 | 1101 | D | 15 |
| 14 | 1110 | E | 16 |
| 15 | 1111 | F | 17 |
2. Umrechnung Schritt für Schritt
Binär nach dezimal: 10101010₂ = 1×128 + 0×64 + 1×32 + 0×16 + 1×8 + 0×4 + 1×2 + 0×1 = 170₁₀. Jede gesetzte Stelle trägt ihre Zweierpotenz bei.
Dezimal nach binär: Wiederholt durch 2 teilen und Reste notieren. Für 13: 13 = 2×6+1; 6 = 2×3+0; 3 = 2×1+1; 1 = 2×0+1. Von unten gelesen ergeben die Reste 1101. Ebenso gilt 255₁₀ = 11111111₂ = FF₁₆ = 377₈.
Binär nach hexadezimal: Von rechts in Vierergruppen teilen und links gegebenenfalls Nullen ergänzen: 1010 1011 1100 1101₂ = ABCD₁₆. Wegen 16 = 2⁴ entspricht jede Gruppe genau einer Hexziffer.
Hexadezimal nach binär: Jede Ziffer durch vier Bits ersetzen: 0x2F → 0010 1111₂ → 47₁₀. Groß- und Kleinschreibung sind gleichwertig.
Oktal: Wegen 8 = 2³ in Dreiergruppen teilen: 11111111₂ → 011 111 111₂ = 377₈. Umgekehrt gilt 17₈ → 001 111₂ = 15₁₀. Stellenweise: 377₈ = 3×8² + 7×8 + 7 = 255. Dezimal nach oktal funktioniert mit wiederholter Division durch 8.
3. Arithmetik und exakte Ganzzahlen
Beispiele: 0x0F + 0b1 = 16, 20 − 7 = 13, 0o7 × 0x3 = 21. Binäre Addition überträgt bei einer Spaltensumme von zwei: 0111 + 0001 = 1000.
Das Werkzeug rechnet durchgängig mit BigInt, auch oberhalb 2⁵³ − 1. Ganzzahldivision schneidet Richtung null ab: −7 ÷ 3 = −2. % liefert einen Rest mit dem Vorzeichen des Dividenden, keinen stets positiven euklidischen Modulo: −7 % 3 = −1. Für b ungleich null gilt a = (a / b) × b + (a % b). Division und Restbildung durch null werden abgelehnt.
4. AND, OR, XOR und NOT
AND behält nur gemeinsam gesetzte Bits; OR setzt ein Bit, wenn mindestens eine Eingabe dort eins ist; XOR setzt es bei unterschiedlichen Eingabebits; NOT kehrt die Bits innerhalb der gewählten Breite um.
| A | B | A AND B | A OR B | A XOR B | NOT A |
|---|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 | 1 |
| 0 | 1 | 0 | 1 | 1 | 1 |
| 1 | 0 | 0 | 1 | 1 | 0 |
| 1 | 1 | 1 | 1 | 0 | 0 |
Acht-Bit-Beispiele: 11111111 & 00001111 = 00001111 (15); 10100000 | 00001111 = 10101111 (175); 10101010 ^ 11111111 = 01010101 (85). NOT von 00001111 ohne Vorzeichen ergibt 11110000 (240). Auto hat keine endliche Maske: ~15 = −16, denn ~x = −x − 1.
5. Vorzeichen und Zweierkomplement
Ohne Vorzeichen ist der Wert Σ bᵢ2ⁱ und der Bereich 0 … 2ʷ−1. Im Zweierkomplement hat das höchste Bit das Gewicht −2ʷ⁻¹; der Bereich ist −2ʷ⁻¹ … 2ʷ⁻¹−1. Ist dieses Bit gesetzt, zieht man 2ʷ vom vorzeichenlosen Wert ab.
Für acht Bits: FF = 255 − 256 = −1, 80 = 128 − 256 = −128. −5 erhält man aus 00000101 durch Invertieren zu 11111010 und Addition von eins: 11111011 = FB. Auf sechzehn Bits ist FFFF gleich −1. Das Zweierkomplement ist eine breitenabhängige Binärdarstellung, keine weitere Basis.
| Bits | Ohne Vorzeichen | Mit Vorzeichen |
|---|---|---|
| 8 | 0 … 255 | −128 … 127 |
| 16 | 0 … 65535 | −32768 … 32767 |
| 32 | 0 … 4294967295 | −2147483648 … 2147483647 |
| 64 | 0 … 18446744073709551615 | −9223372036854775808 … 9223372036854775807 |
DEC ist ein mathematischer Wert. Nichtnegative BIN-, HEX- und OCT-Eingaben sind bei fester Breite Bitmuster: HEX FF mit 8 Bit und Vorzeichen liefert DEC −1; DEC 255 wird abgelehnt. Negative Eingaben müssen als mathematische Werte in den Bereich passen. Es wird keine Eingabe still gekürzt. Nichtdezimale Ausgaben werden mit Nullen aufgefüllt; bei oktal können bis zu zwei obere Stellenbits ungenutzt bleiben.
Auto legt keine Breite und keinen vorzeichenlosen Bereich fest. Negative Werte erscheinen als Minuszeichen und Betrag. Die Bitansicht zeigt höchstens die niedrigsten 128 Betragsbits; Umrechnungen und Kopien enthalten den vollständigen Wert.
6. Verschiebungen und Überlauf
Linksverschiebung um k multipliziert unbeschränkt mit 2ᵏ: 0x01 << 4 = 0x10 = 16. Bei fester Breite maskiert das Werkzeug mit 2ʷ−1. Ohne Vorzeichen auf acht Bits liefert 0x80 << 1 exakt 256, gespeichert aber 0 mit Warnung. Mit Vorzeichen ergibt 0x40 << 1 −128 mit Warnung, weil 128 außerhalb des Bereichs liegt.
Logische Rechtsverschiebung fügt Nullen ein: FF >> 1 = 7F = 127 ohne Vorzeichen. Arithmetische Rechtsverschiebung wiederholt das Vorzeichen: FF >> 1 = FF = −1, 80 >> 1 = C0 = −64 mit Vorzeichen auf acht Bits. Sie rundet bei negativen Werten ab: −3 >> 1 = −2, während −3 / 2 = −1.
B ist immer eine dezimale, nichtnegative Bitanzahl von 0 bis 65536. Diese Arbeitsgrenze verändert nicht die Genauigkeit der Eingabewerte. Verschiebungszahlen werden nicht modulo 32 oder modulo Wortbreite reduziert. Eine vorzeichenlose Acht-Bit-Zahl nach rechts um 8 verschoben ergibt 0. Arithmetischer Überlauf, etwa 255 + 1 ohne Vorzeichen oder −128 / −1 mit Vorzeichen auf acht Bits, wird mit exaktem DEC-Ergebnis abgelehnt. Auto verwendet die unbegrenzte vorzeichenbehaftete BigInt-Semantik.
7. STM32-Register, Masken und Flags
Beim STM32F407 liefert das GPIO-Eingangsregister die Pinzustände. Nach Konfiguration von Takt und Peripherie ermöglicht ein CMSIS-Geräteheader beispielsweise:
uint32_t snapshot = GPIOA->IDR;
uint32_t pin5 = (snapshot >> 5u) & 1u;
uint32_t field = (snapshot >> 4u) & 0x0Fu;
GPIOA->BSRR = 1u << 5u;
Für snapshot = 0xB0 gilt pin5 = 1 und das Feld 7:4 ist 0xB = 11. Die BSRR-Schreiboperation setzt Ausgangsbit 5 ohne softwareseitiges Lesen-Ändern-Schreiben von ODR; der Pinmodus bestimmt weiterhin das äußere Verhalten. Das genaue Gerätehandbuch beschreibt Taktfreigaben, reservierte Bits und durch Schreiben einer Eins löschbare Felder. Ein einzelner Schnappschuss vermeidet mehrere möglicherweise unterschiedliche Registerlesungen.
Für eine lokale vorzeichenlose Flagvariable:
uint32_t flags = 0u;
uint32_t mask = 1u << 3u;
flags |= mask;
flags &= ~mask;
flags ^= mask;
uint32_t active = (flags & mask) != 0u;
0x08 wählt Bit 3. OR setzt es, AND mit dem Komplement löscht es, XOR invertiert es, und der letzte Ausdruck prüft es. Lesen-Ändern-Schreiben ist für gemeinsam genutzten Speicher oder Register nicht automatisch atomar. Dokumentierte Hardwaremechanismen oder geeignete Synchronisation verwenden.
8. CAN, UART, SPI, ADC und FPGA
Die Bytes 0x12 und 0x34 ergeben bei protokollseitig festgelegtem Big Endian (0x12 << 8) | 0x34 = 0x1234 = 4660; Little Endian ergibt 0x3412 = 13330. Für CAN definiert die Nachrichtenspezifikation oder DBC die Felder. UART-Rahmen und SPI-Bitreihenfolge bestimmen nicht allein die Bytereihenfolge eines mehrbyteigen Anwendungswerts. Siehe UART und SPI.
Ein vorzeichenloser 12-Bit-ADC kann 0xABC = 2748 im Bereich 0–4095 liefern. Eine einfache Endpunktzuordnung mit Vref = 3,3 V ergibt 2748 × 3,3 / 4095 ≈ 2,2145 V. Dies ist eine Anzeigenäherung; die ideale Quantisierungsstufe beträgt 3,3/4096 V. Die tatsächliche Kennlinie ist geräteabhängig. Vorzeichenbehaftete ADCs können Zweierkomplement oder Offset-Binärformat verwenden. Codierung und Ausrichtung prüfen; der ADC/DAC-Rechner hilft bei der Auswertung.
Für FPGA und Mikrocontroller Breite und Vorzeichen ausdrücklich deklarieren. In SystemVerilog ist 8'hFF ein vorzeichenloses Acht-Bit-Muster und 8'shFF die vorzeichenbehaftete −1. Ungrößierte Literale und Typumwandlungen beeinflussen Ergebnisse. Die Maskierung dieses Rechners bildet nicht alle C/C++- oder HDL-Regeln nach.
9. Häufige Fragen
Wie rechne ich binär in hexadezimal um?
Bits von rechts in Vierergruppen teilen und jede Gruppe in 0–F umsetzen: 1111 0000 wird F0. Links bei Bedarf Nullen ergänzen.
Was unterscheidet Ganzzahlen mit und ohne Vorzeichen?
Ohne Vorzeichen dienen alle Bits einem nichtnegativen Wert. Im Zweierkomplement hat das höchste Bit negatives Gewicht. FF ist auf acht Bits 255 ohne oder −1 mit Vorzeichen.
Wie funktioniert das Zweierkomplement?
Für einen negativen Wert auf w Bits addiert man ihn zu 2ʷ. Gleichwertig: den positiven Betrag bitweise invertieren und innerhalb der Breite eins addieren.
Was ist eine bitweise XOR-Operation?
XOR liefert eins, wenn Eingabebits verschieden sind. Eine Maske invertiert ausgewählte Positionen: AA XOR FF ergibt 55.
Wie extrahiere ich Bits aus einem Register?
Das Feld nach rechts verschieben und mit einer passenden Maske UND-verknüpfen. Für Bits 7:4: (reg >> 4) & 0x0F. Dabei die Hardware-Lesesemantik beachten.
Warum bedeutet FF manchmal −1?
Das hängt von der Breite ab: Auf acht Bits ist das Vorzeichenbit gesetzt; auf sechzehn Bits ist 00FF dagegen +255.