Cómo leer la tabla de verdad bit a bit
Cada operación lógica bit a bit sigue una tabla de verdad fija que se aplica de forma independiente a cada pareja de posiciones de bit correspondientes.
| Bit A | Bit B | AND | OR | XOR |
|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 |
| 0 | 1 | 0 | 1 | 1 |
| 1 | 0 | 0 | 1 | 1 |
| 1 | 1 | 1 | 1 | 0 |
- La calculadora limita los datos al rango de un entero de 32 bits con signo (de 0 a 2.147.483.647) porque los operadores bit a bit de JavaScript convierten internamente los números a representaciones de 32 bits antes de operar, tal como establece la especificación ECMAScript.
- NOT (~A) da siempre un resultado que, interpretado como entero de 32 bits con signo, vale −(A + 1); aquí se muestra el equivalente sin signo (por ejemplo, ~12 aparece como 4.294.967.283 y no como −13) para que la representación binaria mostrada resulte inequívoca.
- Los desplazamientos (B) mayores de 31 se limitan a 31, ya que desplazar un valor de 32 bits 32 posiciones o más en JavaScript da la vuelta (solo se usan los 5 bits bajos del desplazamiento) en lugar de producir 0, como cabría esperar intuitivamente.
¿Qué son las operaciones bit a bit?
Una operación bit a bit procesa un número al nivel de sus dígitos binarios, comparando o desplazando los ceros y unos de su representación en base 2 en lugar de hacer aritmética decimal corriente. Todo número entero puede escribirse en binario como una secuencia de bits, cada uno asociado a una potencia de 2: 12 en binario es 1100, es decir, 1×8 + 1×4 + 0×2 + 0×1.
Las operaciones lógicas — AND, OR, XOR (o exclusivo) y NOT — comparan las posiciones de bit correspondientes de dos números (o invierten los bits de uno solo) según las reglas habituales del álgebra de Boole, aplicadas de forma independiente a cada posición. Las de desplazamiento mueven todos los bits de un número un número determinado de posiciones a izquierda o derecha, lo que equivale matemáticamente a multiplicar o dividir por una potencia de 2.
Estas operaciones son fundamentales en informática y programación de bajo nivel: sirven para activar, borrar y consultar indicadores individuales dentro de un conjunto de opciones (los bits de bandera), para multiplicar y dividir rápido por potencias de 2, en algoritmos criptográficos, en el tratamiento de gráficos y color (al combinar los canales rojo, verde y azul) y en la codificación compacta de datos.
Cómo usar esta calculadora bit a bit
- Introduce el primer número (A) como entero no negativo, entre 0 y 2.147.483.647, el rango de un entero de 32 bits con signo.
- Introduce el segundo número (B). En AND, OR y XOR es el segundo operando que se compara bit a bit con A. En los desplazamientos indica cuántas posiciones se mueve (de 0 a 31; los valores mayores se limitan a 31). En NOT se ignora, ya que esa operación actúa solo sobre A.
- Selecciona la operación: AND, OR, XOR, NOT, desplazamiento a la izquierda o a la derecha.
- Consulta el resultado en decimal junto con la representación binaria de A, de B (o del desplazamiento) y del resultado.
Cómo funciona cada operación bit a bit
AND compara cada posición de bit y devuelve 1 únicamente allí donde ambos bits valen 1; en el resto, 0. Ejemplo resuelto: 12 (1100) AND 10 (1010) = 8 (1000), porque solo la tercera posición (de valor 8) está a 1 en los dos números.
OR compara cada posición y devuelve 1 allí donde al menos uno de los dos bits vale 1. Ejemplo resuelto: 12 (1100) OR 10 (1010) = 14 (1110). XOR (o exclusivo) devuelve 1 allí donde exactamente uno de los dos bits vale 1, pero no ambos. Ejemplo resuelto: 12 (1100) XOR 10 (1010) = 6 (0110).
NOT invierte todos los bits de un único número (los 0 pasan a 1 y los 1 a 0). Dado que esta calculadora opera con valores de 32 bits, NOT 12 voltea los 32 bits y produce 4.294.967.283 interpretado como entero de 32 bits sin signo (la representación en complemento a dos de −13 si se interpreta con signo).
El desplazamiento a la izquierda (A << B) mueve todos los bits de A B posiciones hacia la izquierda y rellena con 0 las posiciones bajas que quedan libres, lo que equivale a multiplicar A por 2^B. Ejemplo resuelto: 12 << 2 = 48 (igual que 12 × 2² = 12 × 4 = 48). El desplazamiento a la derecha (A >> B) mueve los bits B posiciones hacia la derecha y descarta los bits bajos, lo que equivale a la división entera de A entre 2^B redondeando hacia abajo. Ejemplo resuelto: 12 >> 2 = 3 (igual que ⌊12 ÷ 4⌋ = 3).
Errores frecuentes
- Confundir el AND y el OR bit a bit con sus equivalentes lógicos (booleanos): los primeros actúan sobre cada bit por separado, mientras que los lógicos tratan el valor entero como una única condición de verdadero o falso; salvo en el caso especial de los valores 0 y 1, dan resultados distintos.
- Esperar que un desplazamiento a la izquierda muy grande produzca siempre un número proporcionalmente mayor: si se desplaza lo suficiente, los bits significativos se salen del límite de 32 bits y se descartan (desbordamiento).
- Malinterpretar el resultado de NOT: como voltea los 32 bits, el resultado decimal sin signo de ~A parece muchísimo mayor que A, aunque en la interpretación con signo (complemento a dos) represente en realidad un número negativo pequeño, −(A+1).
- Tomar el desplazamiento a la derecha como una división corriente: en enteros no negativos coincide exactamente con la división entera hacia abajo por una potencia de 2, pero el comportamiento con números negativos cambia según se use un desplazamiento aritmético o lógico.
Preguntas frecuentes
¿Qué diferencia hay entre el AND bit a bit y el AND lógico?
El AND bit a bit (&) compara dos números bit a bit y devuelve un número nuevo en el que cada bit vale 1 solo si ambos bits de entrada valen 1; por ejemplo, 12 & 10 = 8. El AND lógico (&&) trata cada valor completo como una única condición de verdadero o falso y devuelve uno de los operandos o un booleano, evaluando su veracidad en vez de combinar bits sueltos. Son operadores con propósitos distintos y resultados generalmente muy diferentes.
¿Cómo funciona XOR?
XOR (o exclusivo) compara dos números bit a bit y devuelve 1 en cada posición donde exactamente uno de los dos bits vale 1 (ni los dos ni ninguno). Para 12 (1100) XOR 10 (1010), la comparación posición a posición da 0110, que en decimal es 6. XOR se usa habitualmente para conmutar bits, detectar diferencias entre dos valores y en cálculos sencillos de suma de verificación y paridad.
¿Qué hace un desplazamiento a la izquierda?
Un desplazamiento a la izquierda (A << B) mueve todos los bits de la representación binaria de A B posiciones hacia la izquierda y rellena con ceros las posiciones bajas que quedan libres. Equivale matemáticamente a multiplicar A por 2 elevado a B. Por ejemplo, 12 << 2 = 48, el mismo resultado que 12 × 2² = 12 × 4 = 48.
¿Qué hace el NOT bit a bit?
El NOT bit a bit (~A) invierte todos los bits de A: cada 0 pasa a 1 y cada 1 a 0. Aplicado a la representación de 32 bits de 12 (00000000000000000000000000001100), produce un valor con todos esos bits volteados, que como número de 32 bits sin signo se muestra como 4.294.967.283 y que con signo representa −13 en complemento a dos (según la identidad ~A = −(A+1)).
¿En qué se diferencia el desplazamiento a la derecha de la división?
En enteros no negativos, un desplazamiento a la derecha (A >> B) da exactamente el mismo resultado que la división entera hacia abajo entre 2^B: A >> B = ⌊A ÷ 2^B⌋. Por ejemplo, 12 >> 2 = 3, igual que ⌊12 ÷ 4⌋ = 3. Ambas operaciones pueden separarse con números negativos, donde el tipo concreto de desplazamiento (aritmético o lógico) determina el tratamiento del bit de signo, un detalle propio de la programación de bajo nivel.
¿Por qué se limitan aquí las operaciones a enteros de 32 bits?
Porque los operadores bit a bit propios de JavaScript (&, |, ^, ~, <<, >>) convierten internamente sus operandos a enteros de 32 bits antes de operar, según la especificación del lenguaje ECMAScript. Esta calculadora reproduce ese comportamiento estándar, de modo que los datos se limitan al rango representable en 32 bits (de 0 a 2.147.483.647 para los valores no negativos que se admiten aquí).
Referencias
- Warren HS Jr. Hacker's Delight. 2nd ed. Addison-Wesley, 2012. (Standard reference for bitwise algorithms and two's-complement arithmetic.)
- ECMA International. ECMA-262: ECMAScript Language Specification, §6.1.6.1 (Bitwise operators, ToInt32/ToUint32). ecma-international.org.
- Patterson DA, Hennessy JL. Computer Organization and Design: The Hardware/Software Interface. 5th ed. Morgan Kaufmann, 2013. (Binary representation and bitwise logic.)