bitlvl
ES

Chuleta de trucos bit a bit

Todos los modismos de aquí funcionan en C, Go, Rust, Java y JavaScript (32 bits) con los mismos operadores; también en Python, con enteros ilimitados.

Cabe en una página A4 / Letter en vertical; usa «Guardar como PDF» en el diálogo de impresión para conservar una copia.

Operadores

a & bAND: 1 donde ambos son 1
a | bOR: 1 donde alguno es 1
a ^ bXOR: 1 donde difieren
~aNOT: invierte todos los bits (= −a − 1 en complemento a dos)
a << ndesplazar a la izquierda: × 2ⁿ
a >> ndesplazar a la derecha: ÷ 2ⁿ, redondea hacia −∞ con signo (aritmético)
a >>> ndesplazamiento lógico a la derecha (JS, Java); tipos sin signo en otros

Bits sueltos (bit n, 0 = el más bajo)

x & (1 << n)probar: distinto de cero si está activo
(x >> n) & 1obtener el bit como 0 o 1
x | (1 << n)activar
x & ~(1 << n)borrar
x ^ (1 << n)alternar
(x & ~(1 << n)) | (b << n)poner el bit n a b

Máscaras y campos

(1 << n) - 1máscara de los n bits bajos
((1 << w) - 1) << lomáscara de w bits a partir de lo
(x >> lo) & ((1 << w) - 1)extraer un campo de w bits en lo
(x & ~m) | ((v << lo) & m)insertar v en el campo con máscara m
(x & FLAGS) == FLAGStodas las banderas activas
x & FLAGSalguna bandera activa

Bit más bajo / más alto

x & -xaislar el bit activo más bajo
x & (x - 1)borrar el bit activo más bajo
x | (x + 1)activar el bit a cero más bajo
x & (x + 1)borrar los unos finales
x | (x - 1)activar los ceros finales
ctz(x) = log₂(x & -x)índice del bit activo más bajo (__builtin_ctz, bits.TrailingZeros)
31 - clz(x)índice del bit activo más alto = ⌊log₂ x⌋

Pruebas

x && !(x & (x - 1))es potencia de dos
(x & 1) == 0es par
(x ^ y) < 0signos opuestos (con signo)
(x & (a - 1)) == 0alineado a a (a = 2ⁿ)
x == (x & 0xFF)cabe en un byte

Aritmética

(x + a - 1) & -aredondear hacia arriba a múltiplo de a (a = 2ⁿ)
x & -aredondear hacia abajo a múltiplo de a
x & (a - 1)x mod a (a = 2ⁿ, x ≥ 0)
(x + y) >> 1media (puede desbordar); (x & y) + ((x ^ y) >> 1) no
x ^= y; y ^= x; x ^= yintercambio sin temporal (más lento que un temporal; una curiosidad)
(x ^ (x >> 31)) - (x >> 31)valor absoluto, 32 bits con signo
x ^ (x >> 1)binario → código Gray

Contar e invertir

while (x) { x &= x - 1; n++; }popcount (Kernighan); o __builtin_popcount, bits.OnesCount, int.bit_count()
x ^ y, luego popcountdistancia de Hamming
popcount(x) & 1paridad
bswap32(x) / bits.ReverseBytes32intercambiar el orden de bytes (endianness)
bits.Reverse32(x)invertir el orden de los bits

Cuidado

  • Desplazar ≥ la anchura es indefinido en C/C++; se enmascara en JS y Java (1 << 32 == 1).
  • Las operaciones de bits de JS truncan a 32 bits; usa BigInt por encima.
  • ~ sobre tipos sin signo en C ensancha; vuelve a convertir.
  • El desplazamiento a la derecha de un valor negativo con signo depende de la implementación en C antes de C++20 (aritmético en todas partes en la práctica).
  • Precedencia: & liga menos que ==; escribe (x & m) == m.

Los resultados y mensajes de esta herramienta se muestran en inglés.

Preguntas

¿Dónde puedo probar esto?

La calculadora bit a bit muestra cada bit del resultado de AND, OR, XOR, desplazamientos y rotaciones de 8 a 64 bits, y la calculadora de máscaras de bits construye máscaras a partir de posiciones.