Calculadora Bitwise
Ejecuta operaciones bit a bit sobre enteros y consulta los resultados en decimal, hexadecimal y binario.
Cómo funciona
- Introduce dos números: entra los valores sobre los que operar, en decimal, binario (prefijo 0b) o hexadecimal (prefijo 0x).
- Elige la operación: selecciona AND, OR, XOR, NOT, desplazamiento izquierdo (<<) o desplazamiento derecho (>>).
- Consulta el resultado: la salida muestra el resultado en decimal, binario y hexadecimal a la vez, con una visualización bit a bit.
¿Por qué usar la calculadora binaria?
Las operaciones bit a bit son fundamentales en programación de sistemas, criptografía, desarrollo de juegos, gráficos, redes y sistemas embebidos. Entender cómo AND, OR, XOR y los desplazamientos manipulan los bits individuales es crucial para activar/desactivar flags, compactar datos e implementar algoritmos eficientes. Esta calculadora muestra la operación a nivel de bit para ver exactamente cómo se ve afectado cada bit.
Funcionalidades
- Todos los operadores bit a bit: AND (&), OR (|), XOR (^), NOT (~), desplazamiento izquierdo (<<) y desplazamiento derecho (>>).
- Entrada multibase: introduce números en decimal, binario (0b…) o hexadecimal (0x…).
- Salida multibase: los resultados se muestran simultáneamente en decimal, binario y hexadecimal.
- Visualización de bits: una cuadrícula visual muestra qué bits están activados para cada operando y para el resultado.
- Modos con signo/sin signo: cambia entre enteros de 8, 16, 32 y 64 bits.
Preguntas frecuentes
¿Para qué sirve XOR en programación?
XOR (^) sirve para invertir bits, hacer cifrado/ofuscación simple, intercambiar variables sin variable temporal, comprobar la paridad y mezclar hashes. Devuelve 1 cuando los bits difieren y 0 cuando son iguales.
¿Cuál es la diferencia entre << y >>?
El desplazamiento izquierdo (<<) mueve todos los bits a la izquierda, equivalente a una multiplicación por potencias de 2. El desplazamiento derecho (>>) mueve los bits a la derecha, equivalente a una división por potencias de 2. El desplazamiento derecho aritmético preserva el bit de signo; el desplazamiento derecho lógico rellena con ceros.
¿Cómo activar o desactivar un bit concreto?
Para activar el bit n: value |= (1 << n). Para desactivar el bit n: value &= ~(1 << n). Para invertir el bit n: value ^= (1 << n). Para comprobar si el bit n está activado: (value & (1 << n)) !== 0.
Del álgebra booleana al silicio: cómo las operaciones bit a bit se volvieron universales
Las operaciones bit a bit que cada CPU moderna implementa provienen de dos artículos fundacionales publicados con más de 80 años de diferencia. En 1854, George Boole publicó «An Investigation of the Laws of Thought», definiendo el álgebra de la lógica de dos valores, AND, OR, NOT y sus identidades. Era un trabajo filosófico, no de ingeniería. Luego en 1937, un estudiante de máster del MIT de 21 años llamado Claude Shannon escribió su tesis de máster «A Symbolic Analysis of Relay and Switching Circuits», probando que el álgebra booleana podía describir circuitos eléctricos de relés y por lo tanto que cualquier cálculo lógico podía ser implementado físicamente. Esta tesis es ampliamente citada como la tesis de máster más importante del siglo XX y es la base de toda la electrónica digital. El complemento a dos, la representación binaria para números negativos que cada CPU usa, fue patentado en 1962 por Burroughs Corporation pero ya se había usado en el IBM 704 (1954) y otras máquinas tempranas. IEEE 754 estandarizó la representación de punto flotante en 1985, fijando la disposición de bits que cada Number JavaScript todavía usa, 1 bit de signo, 11 exponente, 52 mantisa para binary64. Hoy, los operadores del lenguaje C & | ^ ~ << >> se mapean casi directamente a instrucciones de CPU únicas, razón por la cual el código bit a bit puede ser dramáticamente más rápido que el equivalente aritmético.
Los seis operadores, qué hacen a nivel de bit
- AND (
&). El bit resultado es 1 solo si ambos bits de entrada son 1.0b1100 & 0b1010 = 0b1000. Úsalo para enmascarar, aislar bits específicos, o verificar si una bandera está activa:flags & FLAG_READes no-cero ssiFLAG_READestá activado. - OR (
|). El bit resultado es 1 si cualquiera de los bits de entrada es 1.0b1100 | 0b1010 = 0b1110. Úsalo para establecer bits, combinar banderas:flags = FLAG_READ | FLAG_WRITE. - XOR (
^). El bit resultado es 1 si exactamente un bit de entrada es 1.0b1100 ^ 0b1010 = 0b0110. Úsalo para alternar bits, ofuscación simple (x ^ x = 0, así XOR es su propia inversa), paridad y mezcla de hash. - NOT (
~). Invierte cada bit.~0b0000_1111 = 0b1111_0000(en 8 bits). En complemento a dos,~xequivale a-x − 1, así que~5 === -6en JavaScript. - Desplazamiento izquierdo (
<<). Mover todos los bits a la izquierda por n posiciones, rellenar la derecha con ceros.1 << 3 === 8, equivalente a multiplicar por 2³. Útil para construir máscaras de bits:1 << nes «el bit en la posición n». - Desplazamiento derecho (
>>aritmético,>>>lógico). Mover bits a la derecha. El desplazamiento aritmético (>>en JS, Java, C con signo) preserva el bit de signo; el desplazamiento lógico (>>>en JS,>>en C sin signo) rellena con ceros.-8 >> 1 === -4pero-8 >>> 1 === 2147483644en JavaScript porque>>>coacciona a int sin signo de 32 bits primero.
Donde el bit a bit realmente gana su sueldo
- Banderas de bits y alternancias de características. Empaqueta 32 opciones booleanas en un solo entero. Los permisos de archivos Linux (
chmod 755), las cabeceras de protocolos de red (TCP, IPv4), y las banderas de estado OpenGL todas usan este patrón. Una verificación&te dice si una característica está habilitada. - Permisos de archivos Unix.
rwxr-xr-xes0b111_101_101 = 0o755 = 493. Los tres grupos son usuario/grupo/otro, cada tres bits son read/write/execute. La calculadora chmod convierte la forma simbólica al entero que tu shell quiere. - Máscaras de subred IP. Una máscara
/24es255.255.255.0o0xFFFFFF00. Para verificar si una IP está en una subred:(ip & mask) === (network & mask). Usada por cada router y firewall del mundo. - Criptografía y hashing. SHA-256, AES, ChaCha20, BLAKE3, cada hash y cifrado moderno se construye principalmente a partir de AND, OR, XOR, NOT y rotaciones. XOR solo es la base de los cuadernos de uso único, que son demostrablemente irrompibles cuando la clave es verdaderamente aleatoria y usada una vez.
- Manipulación de colores. Un color RGBA de 32 bits empaqueta cuatro canales de 8 bits:
(R << 24) | (G << 16) | (B << 8) | A. Para extraer el canal rojo:(color >> 24) & 0xFF. Usado por HTML canvas, OpenGL, cada formato de imagen. - Trucos de rendimiento.
x & 1es mucho más rápido quex % 2en la mayoría de CPU (un ciclo vs ~10).x >> 1divide por 2 en un ciclo. La alineación a potencia de dos, los conteos de población de bits y los hacks de manipulación de bits están en todas partes en código crítico en rendimiento. (Ver la página «Bit Twiddling Hacks» de Sean Anderson para un catálogo famoso.) - Sistemas embebidos. Los microcontroladores mapean registros de hardware a posiciones de bits específicas en memoria. Configurar un UART o un pin GPIO requiere enmascarar y desplazar para leer o escribir los bits correctos sin perturbar el resto. La sintaxis de bitfield de C es azúcar conveniente para estos patrones.
Errores que muerden
- Confundir
&con&&y|con||. Las formas simples son bit a bit, las dobles son lógicas de corto circuito.1 & 2 === 0(sin bits compartidos) pero1 && 2 === 2(ambos verdaderos, devuelve el segundo). Mezclarlas rompe silenciosamente la lógica condicional. - Sorpresas de precedencia de operadores.
x & FLAG === 0significax & (FLAG === 0), no(x & FLAG) === 0, porque===se enlaza más fuerte que&. Siempre parentesa expresiones bit a bit en condiciones. - Confusión de desplazamiento con signo vs sin signo. En JavaScript,
>>es aritmético (extensión de signo),>>>es lógico (relleno con cero). C distingue por el tipo de variable, los tipos con signo usan aritmético, los sin signo usan lógico. Java tiene tanto>>como>>>como JavaScript. No coincidir con la convención del lenguaje invierte silenciosamente el significado. - JavaScript trunca a 32 bits para operaciones bit a bit. A pesar de que
Numberes un flotante de 64 bits, todos los operadores bit a bit coercen operandos a int32 primero.0x100000000 & 0xFF === 0, no 0 + el byte bajo, porque el operando es truncado a 32 bits antes del AND. Para manipulación de bits de 64 bits usaBigInt, que tiene sus propios operadores bit a bit. - Desplazar por > 31 en JavaScript.
1 << 32 === 1, no 0. La cantidad de desplazamiento se toma módulo 32. C es aún más peligroso: desplazar por más del ancho de bits es comportamiento indefinido, así que los compiladores pueden hacer cualquier cosa. Siempre verifican < bitWidthantes de desplazar por un valor en tiempo de ejecución. - Endianness en código de empaquetado de bytes.
(r << 24) | (g << 16) | (b << 8) | aproduce0xRRGGBBAA. Si los bytes se almacenan en ese orden o invertidos en memoria depende de la plataforma. ImageData en HTML canvas es little-endian en x86; el formato de archivo PNG es big-endian. Convierte explícitamente conDataViewal leer formatos binarios. - Olvidar el complemento a dos.
~0 === -1, no0xFFFFFFFF, porque todos-unos es la codificación en complemento a dos de −1. Para obtener la interpretación 32 bits sin signo en JavaScript:(~0) >>> 0 === 4294967295.
Por qué complemento a dos, y qué significa a nivel de bit
Cada CPU moderna representa enteros negativos usando complemento a dos. En un byte con signo de 8 bits, los valores 0 a 127 están codificados como binario 0000_0000 a 0111_1111. Luego −1 está codificado como 1111_1111, −2 como 1111_1110, hasta −128 como 1000_0000. La razón: con esta codificación, la suma funciona de la misma manera tanto si las entradas son con signo o sin signo, el CPU no necesita instrucciones separadas add-con-signo y add-sin-signo. La asimetría es que el rango negativo es uno más grande que el positivo (en 8 bits, −128 a +127), razón por la cual Math.abs(INT_MIN) desborda en cada lenguaje con enteros de ancho fijo. Las codificaciones más antiguas signo-magnitud (un bit para el signo, resto para la magnitud) y complemento a uno existieron en los años 1950-60 pero perdieron frente al complemento a dos porque tenían dos representaciones de cero y requerían hardware de caso especial para la negación.
Más preguntas frecuentes
¿Por qué ~5 es igual a -6 en lugar de 250?
Porque en complemento a dos (la codificación que cada CPU moderna usa), voltear cada bit de un número positivo te da -n - 1. Así ~5 === -6 y ~0 === -1. En un contexto sin signo de 8 bits, el mismo patrón de bits que ~5 (binario 1111_1010) representaría 250. JavaScript trata el resultado como signo 32 bits, así que ves -6. Para obtener la interpretación sin signo: (~5) >>> 0 en 32 bits, que da 4294967290, o enmascarar a 8 bits con ~5 & 0xFF que da 250.
¿Es XOR realmente un cifrado?
XOR es el bloque de construcción de cada cifrado simétrico moderno, pero XOR solo no es cifrado seguro. Un cuaderno de uso único, XOR con una clave verdaderamente aleatoria tan larga como el mensaje, usada exactamente una vez, es teóricamente irrompible (Shannon, 1949). Reusa la clave, o usa una clave más corta que el mensaje, y el análisis de frecuencia lo rompe trivialmente. Los cifrados reales como AES usan XOR más difusión y sustitución para amplificar una clave corta en un flujo de bytes pseudo-aleatorios que parecen un cuaderno de uso único para cualquiera sin la clave. Así que «cifrar con XOR» está bien solo para ofuscación trivial, nunca para secretos reales.
¿Cuándo debo usar BigInt en lugar de Number para manipulación de bits?
Cada vez que necesites más de 32 bits de precisión bit a bit. Los operadores bit a bit JavaScript truncan operandos Number a enteros con signo de 32 bits antes de calcular. Si necesitas máscaras de 64 bits (p. ej. manipular un conjunto de banderas de características de 64 bits, trabajar con offsets mmap Linux, o implementar SHA-512), usa BigInt: 0xFFFFFFFFFFFFFFFFn & 0xFFn === 255n. BigInt es más lento que Number, ~3-10× dependiendo de la operación, así que resérvalo para los casos donde 32 bits son genuinamente muy pocos.
¿Cómo cuento el número de bits 1 en un número?
Esto es el conteo de población o peso de Hamming. La mayoría de CPU modernas tienen una sola instrucción para ello (POPCNT en x86, VCNT en ARM). En JavaScript, no hay nativo, así que usa el clásico de manipulación de bits: let c = 0; while (x) { c += x & 1; x >>>= 1; }. O el truco SWAR paralelo de Hacker's Delight: x = x - ((x >> 1) & 0x55555555); x = (x & 0x33333333) + ((x >> 2) & 0x33333333); x = (x + (x >> 4)) & 0x0F0F0F0F; return (x * 0x01010101) >>> 24;, que cuenta los bits en un entero de 32 bits en aproximadamente una docena de ciclos.
¿Se envían mis datos a algún lugar cuando uso esta calculadora?
No. Cada operación se ejecuta en el motor JavaScript de tu navegador, no ocurren llamadas de red durante un cálculo. Abre la pestaña Red en DevTools y haz clic en Calcular, verás cero solicitudes salientes. Seguro para máscaras sensibles, claves o trabajo de diseño de bits propietario.