Magische Zahlen im Code verstehen
& 0xFF, >>> 24, | (1 << 3), 0o644 – nach den Lektionen 11–15 siehst du auf einen Blick, welche Bits so ein Ausdruck liest oder setzt.
Guide
Der Kurs „Zahlensysteme & Bits“ ist ein interaktives Tutorial mit 17 Lektionen, das „Binär“ aus der Abstraktion in Schalter verwandelt, die man anfassen kann: Du gibst eine Zahl ein und die vier Schreibweisen binär, oktal, dezimal und hexadezimal ändern sich gemeinsam; du schaltest ein Bit ein oder aus und der Wert aktualisiert sich sofort; zwei Zahlen durchlaufen AND / OR / XOR oder eine Verschiebung und das Ergebnis erscheint Bit für Bit ausgerichtet; du gibst einen Bruch ein und siehst ihn in die drei Felder Vorzeichen, Exponent und Mantisse zerlegt – und siehst, welchem Dezimalbruch er in doppelter Genauigkeit exakt entspricht. Jede Lektion hat ein konkretes Ziel – eine Zahl umrechnen, 200 zusammenstellen, das Zweierkomplement von −5 schreiben, 5 << 3 ausrechnen – und die Prüfung antwortet sofort.
Aktualisiert am 2026-09-094 sources13 min read
Der Kurs „Zahlensysteme & Bits“ ist ein interaktives Tutorial mit 17 Lektionen, das „Binär“ aus der Abstraktion in Schalter verwandelt, die man anfassen kann: Du gibst eine Zahl ein und die vier Schreibweisen binär, oktal, dezimal und hexadezimal ändern sich gemeinsam; du schaltest ein Bit ein oder aus und der Wert aktualisiert sich sofort; zwei Zahlen durchlaufen AND / OR / XOR oder eine Verschiebung und das Ergebnis erscheint Bit für Bit ausgerichtet; du gibst einen Bruch ein und siehst ihn in die drei Felder Vorzeichen, Exponent und Mantisse zerlegt – und siehst, welchem Dezimalbruch er in doppelter Genauigkeit exakt entspricht. Jede Lektion hat ein konkretes Ziel – eine Zahl umrechnen, 200 zusammenstellen, das Zweierkomplement von −5 schreiben, 5 << 3 ausrechnen – und die Prüfung antwortet sofort.
Der Kurs besteht aus vier Abschnitten: Zahlensysteme (binär ↔ dezimal, Zweierpotenzen, warum hexadezimal und oktal „Kurzschrift“ sind); vorzeichenbehaftete Zahlen (wie das Zweierkomplement die Subtraktion zur Addition macht und warum 127 + 1 durch Überlauf zu −128 wird); Bitoperationen (AND als Maske, OR zum Setzen, XOR zum Umdrehen, Verschieben zum Multiplizieren und Dividieren – und ihr direkter Einsatz in Linux-Rechtebits wie 755); Gleitkommazahlen (das Feldlayout nach IEEE 754 und der wahre Grund für 0.1 + 0.2 !== 0.3).
Etwa 45 Minuten bis zum Durcharbeiten. Für Einsteiger ins Programmieren, Entwickler in der Interviewvorbereitung und alle, die 0x1F, & 0xFF oder chmod 644 jedes Mal nachschlagen müssen; mathematische Vorkenntnisse sind nicht nötig, Addition genügt.
0x enthalten.?lesson=n springst du direkt zu einer Lektion.Der Kurs selbst steht oben auf dieser Seite: Wert ändern, Bit-Schalter klicken, Antwort eintragen.
Lektion 9 „Zweierkomplement bilden“ verlangt das 8-Bit-Zweierkomplement von −5:
Lektion 16 „IEEE-754-Felder“ erhält 0,15625 und das Panel zeigt:
Betrag 5 0 0 0 0 0 1 0 1
Bitweise NOT 1 1 1 1 1 0 1 0
Plus eins 1 1 1 1 1 0 1 1 ← Lösung 11111011
Prüfung vorzeichenlos 251, vorzeichenbehaftet 251 − 256 = −5 ✓0.15625 = 0.00101₂ = 1.01₂ × 2⁻³
Vorzeichen 0
Exponent −3 + 127 = 124 = 01111100 ← Lösung 124
Mantisse 01000000000000000000000 (implizite führende 1)
32 Bit 0 01111100 01000000000000000000000 = 0x3E200000Jedes Zahlensystem ist eine „Summe von Stellenwerten“. Dezimal 203 = 2×100 + 0×10 + 3×1; binär 1011 = 1×8 + 0×4 + 1×2 + 1×1 = 11. Von rechts nach links sind die Stellenwerte 1, 2, 4, 8, 16, 32, 64, 128 und so weiter. Binär → Dezimal heißt, die Stellenwerte der Einsen zu addieren; Dezimal → Binär heißt, wiederholt durch 2 zu teilen und die Reste zu notieren, oder von der größten Zweierpotenz abwärts gierig zu subtrahieren (die Bit-Schalter in Lektion 7 visualisieren genau das).
, nur 2,4 % von 1000 entfernt – deshalb stand KB früher für 1024 Byte. Daraus entstand die Verwirrung, die bis heute anhält: Festplattenhersteller beschriften 1 GB mit , Betriebssysteme rechnen mit , und eine 500-GB-Platte zeigt 465 GiB. Die IEC definierte dafür KiB, MiB und GiB (Binärpräfixe); Linux und macOS haben sie weitgehend übernommen, Windows zeigt weiterhin GB, rechnet aber in GiB. Merkenswert: , , , .
Binär ist zu lang, um bequem gelesen zu werden. Hexadezimal (0–9 plus A–F) stellt 4 Bit in einem Zeichen dar, ein Byte ist damit genau zwei Zeichen: 11111111 = FF, 10110110 = B6. Die Umrechnung läuft nicht über das Dezimalsystem – teile die Binärzahl von rechts in Vierergruppen und schlage jede Gruppe nach, genau das übt Lektion 5. Oktal fasst 3 Bit in einem Zeichen zusammen, historisch für Maschinen mit 12, 24 und 36 Bit Wortbreite; heute lebt es vor allem in Linux-Rechten (755) und den C-Escapes \012. Die Präfixe im Code: 0x für hexadezimal, 0o für oktal, 0b für binär.
Jede nicht negative ganze Zahl hat genau eine Binärdarstellung, deshalb kann eine 8-Bit-Zahl acht unabhängige Schalter (Flag-Bits) tragen: flags = READ | WRITE, if (flags & EXEC). CSS-font-weight, Unix-Dateirechte und Flag-Felder in Netzwerkprotokoll-Headern werden so gepackt. In Lektion 7 stellst du 200 nur mit den Schaltern zusammen – gierig von oben: 200 ≥ 128 also einschalten, 72 übrig ≥ 64 also einschalten, 8 übrig = 2³ also einschalten, ergibt 11001000.
Wie speichert man negative Zahlen? Naheliegend wäre ein Vorzeichenbit, doch dann gäbe es „+0“ und „−0“ und der Addierer müsste Fälle unterscheiden. Das Zweierkomplement legt fest: Eine führende 1 bedeutet negativ, und der Wert entspricht dem vorzeichenlosen Wert minus . In 8 Bit ist 11111111 gleich 255 und zugleich 255 − 256 = −1; 10000000 ist −128. So bildest du das Zweierkomplement einer negativen Zahl: Betrag hinschreiben, alle Bits invertieren, eins addieren – für −5 also 00000101 → 11111010 → 11111011.
Die Eleganz des Zweierkomplements: Die Addition muss die Vorzeichen nicht kennen: −5 + 5 = 11111011 + 00000101 = 1 00000000, und nach Verwerfen des Übertrags aus dem 9. Bit ist das Ergebnis exakt 0. Subtraktion wird damit zur „Addition des Komplements“, und die CPU braucht nur einen Addierer. Der Wertebereich des 8-Bit-Zweierkomplements reicht von −128 bis 127: eine negative Zahl mehr als positive, weil die 0 einen Platz auf der positiven Seite belegt.
Die Bitbreite ist begrenzt, über das Ende hinaus geht es wieder von vorn los. In int8 ist 127 = 01111111; plus eins ergibt 10000000, im Zweierkomplement gelesen −128. Ganzzahlüberläufe in C, Java und Go passieren genauso still; JavaScripts gewöhnliches Number ist eine Gleitkommazahl und läuft nicht über, doch Int8Array, |0 und jede Bitoperation arbeiten auf 32-Bit-Zweierkomplement, und (2 ** 31) | 0 ergibt −2147483648. Das berühmte Jahr-2038-Problem ist ein 32-Bit-Vorzeichen-Sekundenzähler, der am 2038-01-19 03:14:07 UTC ins Negative überläuft; die Fehler „Punktestand wird negativ“ und „Münzen fallen auf null“ in alten Spielen sind dasselbe.
Die drei bitweisen Logikoperationen haben feste Einsatzgebiete:
| Operation | Regel | Idiom |
|---|---|---|
AND & |
1 nur, wenn beide Bits 1 sind | Maske: x & 0x0F nimmt die unteren 4 Bits; IP & Subnetzmaske ergibt die Netzadresse; n & 1 prüft gerade/ungerade |
OR | |
1, wenn eines der Bits 1 ist | Setzen: flags | READ schaltet ein Flag ein, ohne die anderen zu berühren |
XOR ^ |
1 nur, wenn die Bits verschieden sind | Umdrehen / Rückgängigmachen: x ^ m ^ m = x; One-Time-Pads, Prüfsummen, Tauschen ohne Hilfsvariable |
Eine 1 an einer Stelle löschen ist AND kombiniert mit NOT: flags & ~FLAG. Die beiden Identitäten und sind die Wurzel aller Anwendungen: a ^= b; b ^= a; a ^= b vertauscht zwei Zahlen, und das einzige Element, das in einem Array ungerade oft vorkommt, findest du, indem du alles XOR-verknüpfst.
Um n nach links verschieben multipliziert mit (die unteren Bits werden mit 0 gefüllt), nach rechts verschieben teilt durch mit Abrunden. 5 << 3 = 101000 = 40. Verschieben ist die billigste Multiplikation und Division, häufiger aber dient es dem Packen kleiner Felder in eine Ganzzahl: (r << 16) | (g << 8) | b kombiniert drei Werte von 0–255 zu einer 24-Bit-Farbe, und (rgb >> 8) & 0xFF holt G wieder heraus. Achtung, es gibt zwei Rechtsverschiebungen: die arithmetische >> behält das Vorzeichenbit (negativ bleibt negativ), die logische >>> füllt mit 0. JavaScript verschiebt auf 32 Bit, deshalb ergibt 1 << 31 den Wert −2147483648 und 1 << 32 dasselbe wie 1 << 0 = 1, denn der Verschiebezähler wird modulo 32 genommen.
Linux-Dateirechte sind neun Bits: je drei für Eigentümer, Gruppe und Andere, der Reihe nach Lesen r = 4, Schreiben w = 2, Ausführen x = 1. Die Summe jeder Dreiergruppe ist eine Oktalziffer: rwxr-xr-x = 7, 5, 5 → 755; rw-r--r-- = 644. Das ist die direkteste Alltagsanwendung von Stellenwerten und Masken: chmod u+x ist ein OR mit 0o100, chmod o-w ein AND mit ~0o002. Davor können noch die Bits 10–12 stehen (setuid, setgid, sticky), daher sieht man manchmal die vierstellige Form 4755.
Eine Gleitkommazahl ist wissenschaftliche Notation im Binärsystem:
Einfache Genauigkeit sind 32 Bit = 1 Vorzeichenbit s + 8 Exponentbits e (Bias 127) + 23 Mantissenbits f; doppelte Genauigkeit ist 1 + 11 (Bias 1023) + 52. Die Mantisse speichert nur den Nachkommateil – die führende 1 des ganzzahligen Teils ist implizit und spart ein Bit Genauigkeit. Der Exponent wird mit einem Bias gespeichert, damit der bitweise Größenvergleich von Gleitkommazahlen genauso monoton ist wie bei Ganzzahlen. Es gilt 0,15625 = = , das Exponentenfeld ist also −3 + 127 = 124 = 01111100, das Mantissenfeld 01 gefolgt von Nullen.
Einige Sonderfälle: Ein Exponent aus lauter Nullen bedeutet eine subnormale Zahl (für Werte extrem nahe bei 0 und für ±0); lauter Einsen mit Mantisse null ergeben ±∞; lauter Einsen mit Mantisse ungleich null sind NaN – deshalb ist 0/0 NaN, während 1/0 Infinity ergibt, und deshalb hat NaN viele Bitmuster und ist doch „sich selbst nicht gleich“.
Ein Binärbruch kann nur Summen negativer Zweierpotenzen exakt darstellen: 0,5, 0,25, 0,125 und so weiter. ist binär der periodische Bruch , die 52-Bit-Mantisse muss also runden. Die doppelt genaue 0,1 ist daher exakt
etwas größer als 0,1; 0,2 ebenfalls etwas größer; addiert und gerundet ergibt das 0,3000000000000000444…, während das Literal 0,3 dem nächstgelegenen Double 0,29999999999999998889… entspricht – zwei verschiedene Binärzahlen, also ist 0.1 + 0.2 === 0.3 falsch. Das ist kein JavaScript-Fehler; jede Sprache mit IEEE 754 (Python, Java, C, Go) verhält sich gleich.
Was zu tun ist, hängt vom Fall ab: Geld als ganzzahlige Cent oder mit einer Dezimalbibliothek (decimal, BigDecimal, Decimal.js); Vergleiche mit einer Toleranz Math.abs(a − b) < ε; Anzeige mit toFixed(2) erst im letzten Schritt; Zählen mit ganzen Zahlen – doppelte Genauigkeit stellt alle ganzen Zahlen bis exakt dar, darüber ist BigInt die richtige Wahl. Die letzte Multiple-Choice-Frage des Kurses fragt, ob die gespeicherte 0,1 größer oder kleiner als der wahre Wert ist; die Antwort ist „größer“ – die 55511… ab der 18. Stelle der exakten Entwicklung zeigen, warum.
BigInt kommen nicht vor.Math.fround, halbe Genauigkeit und bfloat16 bleiben außen vor.0x enthalten.10000000 gleich −128 und nicht −0, und −1 ist lauter Einsen.>> ist einfach Division durch 2“: Bei negativen Zahlen wird abgerundet (Richtung −∞) statt zur Null hin: −5 >> 1 ergibt −3, Math.trunc(−5 / 2) ergibt −2.toFixed sind Geldbeträge gelöst“: toFixed rundet nur für die Anzeige; die Fehler der Zwischenschritte sind bereits angesammelt. Geld sollte von Anfang an als ganzzahlige Cent geführt werden.Int32Array und | 0 arbeiten auf 32-Bit-Zweierkomplement und laufen über; Number verliert oberhalb von die Ganzzahlgenauigkeit.& 0xFF, >>> 24, | (1 << 3), 0o644 – nach den Lektionen 11–15 siehst du auf einen Blick, welche Bits so ein Ausdruck liest oder setzt.
Der Überlauf aus Lektion 10 und die Rundung aus Lektion 17 erklären die meisten solcher Bugs: Im ersten Fall hilft ein breiterer Typ oder BigInt, im zweiten ganzzahlige Cent oder eine Dezimalbibliothek.
Eine Subnetzmaske ist eine AND-Maske (Lektion 11): 192.168.1.37 & 255.255.255.0 = 192.168.1.0; dazu die Bedeutung von chmod 755 / 644 und die Frage, warum ein Skript keine Ausführungsrechte hat (Lektion 15).
Zweierkomplement, Überlauf, XOR-Tausch, Verschieben als Multiplikation, IEEE-754-Felder und 0.1 + 0.2 gehören zu den häufigsten Grundlagenfragen; jede Lektion ist zugleich ein Selbsttest.
Die meisten Lektionen erlauben es, führende Nullen wegzulassen (1011 und 00001011 sind beide richtig); Lektionen mit der Angabe „8-Bit-Zweierkomplement“ verlangen genau 8 Bit, weil die Bitbreite Teil der Antwort ist.
0x?Nein, ff, FF und 0xFF gelten alle als richtig.
Zwei Lesarten derselben Bitfolge: vorzeichenlos zählt das höchste Bit als , vorzeichenbehaftet als . 11111111 ist mit 8 Bit vorzeichenlos 255 und vorzeichenbehaftet −1.
Mantisse und Exponent des Doubles werden per Definition als rationale Zahl ausgeschrieben und anschließend per schriftlicher Division in alle Dezimalstellen entwickelt – das ist keine Näherung, sondern die exakte Dezimaldarstellung dieser Binärzahl.
Im localStorage des aktuellen Browsers, ohne Übertragung; der Link zum „Teilen dieser Lektion“ enthält nur die Lektionsnummer, keinen Fortschritt.
Der Kurs läuft vollständig lokal im Browser: Zahlensystem-Umrechnung, Bitoperationen, Gleitkomma-Feldzerlegung und exakte Entwicklung sind reine Funktionen auf der Seite und fragen keinen Server; der Fortschritt liegt im lokalen localStorage.
chmod-Werkzeug – Definition von symbolischem und oktalem Modus: https://pubs.opengroup.org/onlinepubs/9799919799/utilities/chmod.html(abgerufen am 2026-09-09)Aktualisiert am 2026-09-09
17 Stationen: Umrechnung zwischen binär, oktal und hexadezimal, Bitschalten, Zweierkomplement und Überlauf, AND, OR, XOR und Schieben, chmod-Rechtebits, IEEE 754 und das Rätsel um 0,1 plus 0,2
Dieses Werkzeug ist noch nicht vollständig übersetzt; einige Inhalte nutzen die Ausgangssprache oder die Rückfallsprache.
ZielDas Wertefeld zeigt binär 1011. Was ist es in Dezimalzahl?
Der Stellenwert jeder Ziffer ist eine Potenz von 2: ganz rechts ist 2⁰=1, dann 2, 4, 8, 16 … Addieren Sie die Gewichtungen, deren Bit 1 ist: 1011 = 8 + 0 + 2 + 1 = 11. Durch Klicken auf ein beliebiges Bit im Bedienfeld wird die Dezimalzahl sofort aktualisiert – eine schnellere Möglichkeit, Intuition zu entwickeln, als sich Regeln zu merken.