bitlvl
ES

Calculadora bit a bit

Elige una operación y una anchura. Cambia los bits directamente en los registros o escribe valores en hex, decimal o binario. Se muestra cada bit del resultado.

Anchura (bits)
Introducir valores como
  

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

Qué hacen las operaciones bit a bit

Una operación bit a bit trata un número como una fila de bits y trabaja cada posición de forma independiente. Son las operaciones más rápidas que tiene una CPU y aparecen por todas partes: banderas de permisos, máscaras de red, funciones hash, gráficos, compresión y análisis de protocolos.

OperaciónSímbolo (C, JS, Go, Python)Regla por bitUso típico
AND&1 solo si ambos bits son 1Enmascarar bits, comprobar una bandera: x & FLAG
OR|1 si cualquiera de los bits es 1Activar una bandera: x | FLAG
XOR^1 si los bits son distintosAlternar una bandera, intercambiar, sumas de comprobación
NOT~Invierte cada bitConstruir una máscara inversa: x & ~FLAG borra una bandera
Desplazar a la izquierda<<Mueve los bits a la izquierda, rellena con 0Multiplicar por 2ⁿ, construir una máscara: 1 << n
Desplazar a la derecha>>Mueve los bits a la derechaDividir entre 2ⁿ, extraer un campo
Rotarrotl / rotrDesplaza; los bits que salen vuelven a entrar por el otro extremoHashes y cifrados

Desplazamiento aritmético y lógico a la derecha

Hay dos variantes de desplazamiento a la derecha. Un desplazamiento lógico rellena los nuevos bits superiores con ceros. Uno aritmético copia el bit de signo, de modo que un número negativo en complemento a dos sigue siendo negativo. En C y Go, >> sobre un tipo con signo es aritmético y sobre uno sin signo es lógico. JavaScript tiene ambos: >> es aritmético y >>> lógico. Pon aquí la anchura en 8 y prueba -8 >> 1 para ver la diferencia.

Por qué importa la anchura

En un registro real, los bits desplazados más allá del extremo superior se pierden, y NOT invierte exactamente tantos bits como tiene el registro. ~0 es 255 en 8 bits, 65535 en 16 y 4294967295 en 32. Esta calculadora trabaja siempre en la anchura elegida, así que los resultados coinciden con lo que tu código ve en un uint8_t, uint32, etc.

Modismos habituales

Comprobar si el bit n está activo
(x >> n) & 1 o x & (1 << n)
Activar, borrar, alternar el bit n
x | (1 << n) · x & ~(1 << n) · x ^ (1 << n)
¿Es x una potencia de dos?
x != 0 && (x & (x - 1)) == 0
Redondear hacia arriba a un múltiplo de 8
(x + 7) & ~7
Bit activo más bajo
x & -x

Preguntas

¿Cuál es la diferencia entre operadores lógicos y bit a bit?

Los operadores lógicos (&&, ||, !) tratan valores enteros como verdadero o falso y devuelven un único verdadero/falso. Los operadores bit a bit (&, |, ^, ~) trabajan sobre cada bit de los operandos y devuelven un número. 6 && 3 es verdadero, pero 6 & 3 es 2.

¿Por qué NOT devuelve un número negativo en mi código?

Si la variable tiene signo, el bit superior es el bit de signo. ~5 en complemento a dos de 32 bits es 0xFFFFFFFA, que un int con signo muestra como −6. Guarda el resultado en un tipo sin signo o enmascáralo (~5 & 0xFF = 250) para ver el patrón de bits en bruto.

¿Qué pasa con los bits desplazados más allá del extremo?

En un registro de anchura fija se descartan. Desplazar a la izquierda puede perder los bits superiores (desbordamiento); desplazar a la derecha pierde los bits inferiores (por eso x >> 1 redondea hacia abajo). Las rotaciones son distintas: los bits vuelven a entrar por el otro extremo.

¿XOR de un número consigo mismo da siempre cero?

Sí. Cada bit se compara con un bit idéntico, y XOR de bits iguales es 0. Por eso x ^ x = 0, y por eso XOR puede encontrar el único elemento sin pareja en una lista donde todo lo demás aparece dos veces.

¿Puedo usarla para valores de 64 bits?

Sí. La herramienta calcula con enteros de precisión arbitraria y enmascara a la anchura elegida, así que las operaciones de 64 bits son exactas, a diferencia de los operadores nativos de JavaScript, que se detienen en 32 bits.