bitlvl
IT

Scheda dei trucchi bit a bit

Ogni idioma qui funziona in C, Go, Rust, Java e JavaScript (32 bit) con gli stessi operatori; anche in Python, con interi illimitati.

Sta in una pagina A4 / Letter verticale; usa «Salva come PDF» nella finestra di stampa per conservarne una copia.

Operatori

a & bAND: 1 dove entrambi sono 1
a | bOR: 1 dove almeno uno è 1
a ^ bXOR: 1 dove differiscono
~aNOT: inverte tutti i bit (= −a − 1 in complemento a due)
a << nshift a sinistra: × 2ⁿ
a >> nshift a destra: ÷ 2ⁿ, arrotonda verso −∞ con segno (aritmetico)
a >>> nshift logico a destra (JS, Java); tipi senza segno altrove

Bit singoli (bit n, 0 = il più basso)

x & (1 << n)test: diverso da zero se impostato
(x >> n) & 1ottenere il bit come 0 o 1
x | (1 << n)impostare
x & ~(1 << n)azzerare
x ^ (1 << n)invertire
(x & ~(1 << n)) | (b << n)impostare il bit n a b

Maschere e campi

(1 << n) - 1maschera degli n bit bassi
((1 << w) - 1) << lomaschera di w bit a partire da lo
(x >> lo) & ((1 << w) - 1)estrarre un campo di w bit in lo
(x & ~m) | ((v << lo) & m)inserire v nel campo con maschera m
(x & FLAGS) == FLAGStutti i flag impostati
x & FLAGSalmeno un flag impostato

Bit più basso / più alto

x & -xisolare il bit impostato più basso
x & (x - 1)azzerare il bit impostato più basso
x | (x + 1)impostare il bit a zero più basso
x & (x + 1)azzerare gli 1 finali
x | (x - 1)impostare gli 0 finali
ctz(x) = log₂(x & -x)indice del bit impostato più basso (__builtin_ctz, bits.TrailingZeros)
31 - clz(x)indice del bit impostato più alto = ⌊log₂ x⌋

Test

x && !(x & (x - 1))è una potenza di due
(x & 1) == 0è pari
(x ^ y) < 0segni opposti (con segno)
(x & (a - 1)) == 0allineato ad a (a = 2ⁿ)
x == (x & 0xFF)sta in un byte

Aritmetica

(x + a - 1) & -aarrotondare per eccesso a un multiplo di a (a = 2ⁿ)
x & -aarrotondare per difetto a un multiplo di a
x & (a - 1)x mod a (a = 2ⁿ, x ≥ 0)
(x + y) >> 1media (può andare in overflow); (x & y) + ((x ^ y) >> 1) no
x ^= y; y ^= x; x ^= yscambio senza variabile temporanea (più lento di una temporanea; una curiosità)
(x ^ (x >> 31)) - (x >> 31)valore assoluto, 32 bit con segno
x ^ (x >> 1)binario → codice Gray

Contare e invertire

while (x) { x &= x - 1; n++; }popcount (Kernighan); oppure __builtin_popcount, bits.OnesCount, int.bit_count()
x ^ y, poi popcountdistanza di Hamming
popcount(x) & 1parità
bswap32(x) / bits.ReverseBytes32scambiare l’ordine dei byte (endianness)
bits.Reverse32(x)invertire l’ordine dei bit

Attenzione

  • Uno shift ≥ della larghezza è indefinito in C/C++; mascherato in JS e Java (1 << 32 == 1).
  • Le operazioni sui bit in JS troncano a 32 bit; oltre usa BigInt.
  • ~ sui tipi senza segno in C allarga; riconverti.
  • Lo shift a destra di un valore negativo con segno è definito dall’implementazione in C prima di C++20 (aritmetico ovunque in pratica).
  • Precedenza: & lega meno di ==; scrivi (x & m) == m.

I risultati e i messaggi di questo strumento sono mostrati in inglese.

Domande

Dove posso provare questi trucchi?

Il calcolatore bit a bit mostra ogni bit del risultato di AND, OR, XOR, shift e rotazioni da 8 a 64 bit, e il calcolatore di bitmask costruisce maschere dalle posizioni.