bitlvl
DE

Spickzettel Bit-Tricks

Jedes Idiom hier funktioniert in C, Go, Rust, Java und JavaScript (32 Bit) mit denselben Operatoren; auch in Python, mit unbegrenzten Ganzzahlen.

Passt auf eine A4-/Letter-Seite im Hochformat; mit „Als PDF speichern“ im Druckdialog behalten Sie eine Kopie.

Operatoren

a & bUND: 1, wo beide 1 sind
a | bODER: 1, wo eines 1 ist
a ^ bXOR: 1, wo sie sich unterscheiden
~aNICHT: alle Bits kippen (= −a − 1 im Zweierkomplement)
a << nLinksshift: × 2ⁿ
a >> nRechtsshift: ÷ 2ⁿ, rundet bei vorzeichenbehaftet gegen −∞ (arithmetisch)
a >>> nlogischer Rechtsshift (JS, Java); anderswo vorzeichenlose Typen

Einzelne Bits (Bit n, 0 = niedrigstes)

x & (1 << n)testen: ungleich null, wenn gesetzt
(x >> n) & 1Bit als 0 oder 1 holen
x | (1 << n)setzen
x & ~(1 << n)löschen
x ^ (1 << n)kippen
(x & ~(1 << n)) | (b << n)Bit n auf b setzen

Masken und Felder

(1 << n) - 1Maske der unteren n Bits
((1 << w) - 1) << loMaske von w Bits ab lo
(x >> lo) & ((1 << w) - 1)w-Bit-Feld bei lo extrahieren
(x & ~m) | ((v << lo) & m)v in Feld mit Maske m einfügen
(x & FLAGS) == FLAGSalle Flags gesetzt
x & FLAGSirgendein Flag gesetzt

Niedrigstes / höchstes Bit

x & -xniedrigstes gesetztes Bit isolieren
x & (x - 1)niedrigstes gesetztes Bit löschen
x | (x + 1)niedrigstes gelöschtes Bit setzen
x & (x + 1)nachlaufende Einsen löschen
x | (x - 1)nachlaufende Nullen setzen
ctz(x) = log₂(x & -x)Index des niedrigsten gesetzten Bits (__builtin_ctz, bits.TrailingZeros)
31 - clz(x)Index des höchsten gesetzten Bits = ⌊log₂ x⌋

Tests

x && !(x & (x - 1))ist Zweierpotenz
(x & 1) == 0ist gerade
(x ^ y) < 0entgegengesetzte Vorzeichen (vorzeichenbehaftet)
(x & (a - 1)) == 0auf a ausgerichtet (a = 2ⁿ)
x == (x & 0xFF)passt in ein Byte

Arithmetik

(x + a - 1) & -aauf Vielfaches von a aufrunden (a = 2ⁿ)
x & -aauf Vielfaches von a abrunden
x & (a - 1)x mod a (a = 2ⁿ, x ≥ 0)
(x + y) >> 1Mittelwert (kann überlaufen); (x & y) + ((x ^ y) >> 1) nicht
x ^= y; y ^= x; x ^= yTausch ohne Hilfsvariable (langsamer als eine; eine Kuriosität)
(x ^ (x >> 31)) - (x >> 31)Absolutwert, 32 Bit vorzeichenbehaftet
x ^ (x >> 1)binär → Gray-Code

Zählen und Umkehren

while (x) { x &= x - 1; n++; }Popcount (Kernighan); oder __builtin_popcount, bits.OnesCount, int.bit_count()
x ^ y, dann PopcountHamming-Distanz
popcount(x) & 1Parität
bswap32(x) / bits.ReverseBytes32Byte-Reihenfolge tauschen (Endianness)
bits.Reverse32(x)Bit-Reihenfolge umkehren

Vorsicht

  • Shift um ≥ Breite ist in C/C++ undefiniert; in JS und Java maskiert (1 << 32 == 1).
  • JS-Bitoperationen kürzen auf 32 Bit; darüber BigInt nutzen.
  • ~ auf vorzeichenlosen Typen in C erweitert; zurückcasten.
  • Rechtsshift eines negativen vorzeichenbehafteten Werts ist in C vor C++20 implementierungsabhängig (praktisch überall arithmetisch).
  • Vorrang: & bindet schwächer als ==; schreiben Sie (x & m) == m.

Die Ergebnisse und Meldungen dieses Tools werden auf Englisch angezeigt.

Fragen

Wo kann ich das ausprobieren?

Der Bitweise-Rechner zeigt jedes Bit des Ergebnisses für UND, ODER, XOR, Shifts und Rotationen bei 8–64 Bit, und der Bitmasken-Rechner baut Masken aus Positionen.