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ón | Símbolo (C, JS, Go, Python) | Regla por bit | Uso típico |
|---|---|---|---|
| AND | & | 1 solo si ambos bits son 1 | Enmascarar bits, comprobar una bandera: x & FLAG |
| OR | | | 1 si cualquiera de los bits es 1 | Activar una bandera: x | FLAG |
| XOR | ^ | 1 si los bits son distintos | Alternar una bandera, intercambiar, sumas de comprobación |
| NOT | ~ | Invierte cada bit | Construir una máscara inversa: x & ~FLAG borra una bandera |
| Desplazar a la izquierda | << | Mueve los bits a la izquierda, rellena con 0 | Multiplicar por 2ⁿ, construir una máscara: 1 << n |
| Desplazar a la derecha | >> | Mueve los bits a la derecha | Dividir entre 2ⁿ, extraer un campo |
| Rotar | rotl / rotr | Desplaza; los bits que salen vuelven a entrar por el otro extremo | Hashes 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
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.