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.
Ogni idioma qui funziona in C, Go, Rust, Java e JavaScript (32 bit) con gli stessi operatori; anche in Python, con interi illimitati.
| a & b | AND: 1 dove entrambi sono 1 |
| a | b | OR: 1 dove almeno uno è 1 |
| a ^ b | XOR: 1 dove differiscono |
| ~a | NOT: inverte tutti i bit (= −a − 1 in complemento a due) |
| a << n | shift a sinistra: × 2ⁿ |
| a >> n | shift a destra: ÷ 2ⁿ, arrotonda verso −∞ con segno (aritmetico) |
| a >>> n | shift logico a destra (JS, Java); tipi senza segno altrove |
| x & (1 << n) | test: diverso da zero se impostato |
| (x >> n) & 1 | ottenere 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 |
| (1 << n) - 1 | maschera degli n bit bassi |
| ((1 << w) - 1) << lo | maschera 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) == FLAGS | tutti i flag impostati |
| x & FLAGS | almeno un flag impostato |
| x & -x | isolare 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⌋ |
| x && !(x & (x - 1)) | è una potenza di due |
| (x & 1) == 0 | è pari |
| (x ^ y) < 0 | segni opposti (con segno) |
| (x & (a - 1)) == 0 | allineato ad a (a = 2ⁿ) |
| x == (x & 0xFF) | sta in un byte |
| (x + a - 1) & -a | arrotondare per eccesso a un multiplo di a (a = 2ⁿ) |
| x & -a | arrotondare per difetto a un multiplo di a |
| x & (a - 1) | x mod a (a = 2ⁿ, x ≥ 0) |
| (x + y) >> 1 | media (può andare in overflow); (x & y) + ((x ^ y) >> 1) no |
| x ^= y; y ^= x; x ^= y | scambio 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 |
| while (x) { x &= x - 1; n++; } | popcount (Kernighan); oppure __builtin_popcount, bits.OnesCount, int.bit_count() |
| x ^ y, poi popcount | distanza di Hamming |
| popcount(x) & 1 | parità |
| bswap32(x) / bits.ReverseBytes32 | scambiare l’ordine dei byte (endianness) |
| bits.Reverse32(x) | invertire l’ordine dei bit |
1 << 32 == 1).~ sui tipi senza segno in C allarga; riconverti.& lega meno di ==; scrivi (x & m) == m.I risultati e i messaggi di questo strumento sono mostrati in inglese.
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.