Operadores bit a bit: AND, OR, XOR, NOT y desplazamientos
Qué hace cada operador, cómo se calcula a mano y para qué se usan de verdad en programación, redes y electrónica.
This guide is currently available in Spanish only. Your browser can translate it automatically.
Qué significa operar «bit a bit»
La mayoría de las operaciones que conocemos (sumar, multiplicar) tratan el número como un todo. Las operaciones bit a bit, en cambio, escriben los números en binario y trabajan posición por posición, sin acarreos: el resultado de cada bit depende solo de los bits que están en esa misma posición.
Para los ejemplos usaremos A = 12 (1100) y B = 10 (1010).
AND: los dos a la vez
AND deja un 1 solo donde ambos números tienen un 1.
| A | B | A AND B |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 0 |
| 1 | 0 | 0 |
| 1 | 1 | 1 |
1100 AND 1010 = 1000 = 8. Su uso típico es como máscara: para quedarte con ciertos bits y poner a cero el resto. Por ejemplo, n AND 1 te dice si un número es par (resultado 0) o impar (resultado 1), y la dirección de red de una IP se obtiene haciendo AND con la máscara de subred.
OR: al menos uno
OR deja un 1 donde cualquiera de los dos tiene un 1.
1100 OR 1010 = 1110 = 14. Se usa para activar bits sin tocar los demás, por ejemplo para añadir un permiso o una opción (flag) a un conjunto de opciones guardadas en un solo número.
XOR: solo si son distintos
XOR (o exclusivo) deja un 1 donde los bits son diferentes.
1100 XOR 1010 = 0110 = 6. Tiene propiedades muy útiles: hacer XOR dos veces con el mismo valor devuelve el original (A XOR B XOR B = A), por eso aparece en algoritmos de cifrado sencillos, en sumas de verificación y para alternar un bit entre 0 y 1.
NOT: invertirlo todo
NOT trabaja con un solo número y cambia cada 0 por 1 y cada 1 por 0. Aquí hay un detalle importante: el resultado depende de cuántos bits se usen. Con 4 bits, NOT 1100 = 0011 = 3; pero con 32 bits, los 28 ceros de la izquierda también se invierten y NOT 12 = 4.294.967.283. Por eso las calculadoras y los lenguajes de programación siempre trabajan con un tamaño fijo (8, 16, 32 o 64 bits).
Desplazamientos: mover los bits
- Desplazamiento a la izquierda (
<<): mueve todos los bits hacia la izquierda y rellena con ceros por la derecha. Cada posición equivale a multiplicar por 2: 5 (101) << 1 = 10 (1010), y 5 << 3 = 40. - Desplazamiento a la derecha (
>>): mueve los bits hacia la derecha y descarta los que salen. Cada posición equivale a dividir entre 2 sin decimales: 13 (1101) >> 1 = 6 (110).
Los desplazamientos son muy rápidos para el procesador, y se usan mucho para construir máscaras: 1 << n genera un número con un único 1 en la posición n.
Un ejemplo real: permisos con flags
Imagina que guardas los permisos de un usuario en un solo número, donde cada bit es un permiso: leer = 1 (001), escribir = 2 (010), ejecutar = 4 (100).
- Dar permisos de leer y escribir: 1 OR 2 = 3 (
011). - Comprobar si puede escribir: 3 AND 2 = 2 (distinto de 0 → sí).
- Quitar el permiso de escribir: 3 AND (NOT 2) = 1 (
001).
Es exactamente la idea detrás de los permisos de archivos en Linux (el famoso chmod 755) y de muchos registros de configuración en microcontroladores como los de Arduino.