Was bitweise Operationen tun
Eine bitweise Operation behandelt eine Zahl als Reihe von Bits und bearbeitet jede Position unabhängig. Es sind die schnellsten Operationen einer CPU, und sie tauchen überall auf: Berechtigungs-Flags, Netzmasken, Hashfunktionen, Grafik, Kompression und Protokoll-Parsing.
| Operation | Symbol (C, JS, Go, Python) | Regel pro Bit | Typische Verwendung |
|---|---|---|---|
| AND | & | 1 nur, wenn beide Bits 1 sind | Bits ausmaskieren, Flag prüfen: x & FLAG |
| OR | | | 1, wenn eines der Bits 1 ist | Flag setzen: x | FLAG |
| XOR | ^ | 1, wenn die Bits verschieden sind | Flag umschalten, Tausch, Prüfsummen |
| NOT | ~ | Jedes Bit kippen | Inverse Maske bauen: x & ~FLAG löscht ein Flag |
| Linksschieben | << | Bits nach links, mit 0 auffüllen | Mit 2ⁿ multiplizieren, Maske bauen: 1 << n |
| Rechtsschieben | >> | Bits nach rechts | Durch 2ⁿ teilen, Feld extrahieren |
| Rotieren | rotl / rotr | Schieben; herausfallende Bits kommen am anderen Ende wieder herein | Hashes und Chiffren |
Arithmetisches und logisches Rechtsschieben
Rechtsschieben gibt es in zwei Varianten. Ein logischer Shift füllt die neuen oberen Bits mit Nullen. Ein arithmetischer Shift kopiert das Vorzeichenbit, sodass eine negative Zweierkomplementzahl negativ bleibt. In C und Go ist >> auf einem vorzeichenbehafteten Typ arithmetisch und auf einem vorzeichenlosen logisch. JavaScript hat beides: >> ist arithmetisch, >>> logisch. Stellen Sie hier die Breite auf 8 und probieren Sie -8 >> 1, um den Unterschied zu sehen.
Warum die Breite wichtig ist
In einem echten Register gehen Bits verloren, die über das obere Ende geschoben werden, und NOT kippt genau so viele Bits, wie das Register hat. ~0 ist 255 in 8 Bit, 65535 in 16 Bit und 4294967295 in 32. Dieser Rechner arbeitet immer in der gewählten Breite, sodass die Ergebnisse dem entsprechen, was Ihr Code in einem uint8_t, uint32 und so weiter sieht.
Gängige Idiome
Fragen
Was ist der Unterschied zwischen logischen und bitweisen Operatoren?
Logische Operatoren (&&, ||, !) behandeln ganze Werte als wahr oder falsch und liefern ein einzelnes Wahr/Falsch. Bitweise Operatoren (&, |, ^, ~) arbeiten auf jedem Bit der Operanden und liefern eine Zahl. 6 && 3 ist wahr, aber 6 & 3 ist 2.
Warum liefert NOT in meinem Code eine negative Zahl?
Wenn die Variable vorzeichenbehaftet ist, ist das oberste Bit das Vorzeichenbit. ~5 im 32-Bit-Zweierkomplement ist 0xFFFFFFFA, was ein signed int als −6 anzeigt. Speichern Sie das Ergebnis in einem vorzeichenlosen Typ oder maskieren Sie es (~5 & 0xFF = 250), um das rohe Bitmuster zu sehen.
Was passiert mit Bits, die über das Ende geschoben werden?
In einem Register fester Breite werden sie verworfen. Linksschieben kann daher die oberen Bits verlieren (Überlauf); Rechtsschieben verliert die unteren Bits (deshalb rundet x >> 1 ab). Rotationen sind anders: Die Bits kommen am anderen Ende wieder herein.
Ergibt XOR einer Zahl mit sich selbst immer null?
Ja. Jedes Bit wird mit einem identischen Bit verglichen, und XOR gleicher Bits ist 0. Deshalb ist x ^ x = 0, und deshalb kann XOR das eine ungepaarte Element in einer Liste finden, in der alles andere doppelt vorkommt.
Kann ich das für 64-Bit-Werte verwenden?
Ja. Das Tool rechnet mit Ganzzahlen beliebiger Genauigkeit und maskiert auf die gewählte Breite, 64-Bit-Operationen sind also exakt, anders als die nativen JavaScript-Operatoren, die bei 32 Bit aufhören.