¿Qué es un desplazamiento de bits?
Un desplazamiento de bits mueve los dígitos binarios de un número entero hacia la izquierda o hacia la derecha un número determinado de posiciones. Es una operación esencial en programación, optimización de bajo nivel, gráficos, funciones hash y sistemas embebidos. Un desplazamiento a la izquierda (n << k) empuja los bits hacia el extremo más significativo y rellena con ceros, mientras que un desplazamiento a la derecha (n >> k) los lleva hacia el extremo menos significativo.
Cómo usar esta calculadora
Introduce el entero n, la cantidad de desplazamiento k (en bits) y elige la dirección. La calculadora te devuelve el valor decimal resultante. Esta herramienta trabaja con aritmética de enteros con signo de 64 bits, igual que el comportamiento de la mayoría de los lenguajes de programación.
La fórmula explicada
Cada desplazamiento de una posición a la izquierda duplica el número, así que desplazar k posiciones a la izquierda equivale a multiplicar por \(2^{k}\):
$$\text{Result} = \text{Number (n)} \ll \text{Shift (k)} = n \times 2^{k}$$Cada desplazamiento de una posición a la derecha reduce el número a la mitad con truncamiento, de modo que un desplazamiento de k posiciones a la derecha realiza una división entera por \(2^{k}\):
$$\text{Result} = \text{Number (n)} \gg \text{Shift (k)} = \left\lfloor \frac{n}{2^{k}} \right\rfloor$$Por eso los desplazamientos son mucho más baratos para el hardware que multiplicar o dividir.
Ejemplo resuelto
Tomemos n = 16 y desplacemos 2 posiciones a la izquierda (k = 2). En binario, 16 es 10000. Al desplazar dos veces a la izquierda se añaden dos ceros: 1000000, que equivale a 64. Matemáticamente, \(16 \times 2^{2} = 16 \times 4 = 64\). En sentido contrario, \(64 \gg 2 = \left\lfloor 64 / 4 \right\rfloor = 16\) recupera el valor original.
Tabla de referencia de potencias de dos
Un desplazamiento a la izquierda por \(k\) multiplica un número por \(2^k\); un desplazamiento a la derecha por \(k\) divide entre \(2^k\) (descartando el resto para enteros). Usa esta tabla para leer instantáneamente el multiplicador o divisor para una cantidad de desplazamiento dada.
| Desplazamiento \(k\) | \(2^k\) (decimal) | Significado de \(\ll k\) / \(\gg k\) |
|---|---|---|
| 0 | 1 | sin cambio |
| 1 | 2 | \(\times 2\) / \(\div 2\) |
| 2 | 4 | \(\times 4\) / \(\div 4\) |
| 3 | 8 | \(\times 8\) / \(\div 8\) |
| 4 | 16 | \(\times 16\) |
| 5 | 32 | \(\times 32\) |
| 6 | 64 | \(\times 64\) |
| 7 | 128 | \(\times 128\) |
| 8 | 256 | \(\times 256\) (1 byte) |
| 9 | 512 | \(\times 512\) |
| 10 | 1,024 | \(\times 1024\) (1 KiB) |
| 11 | 2,048 | \(\times 2048\) |
| 12 | 4,096 | \(\times 4096\) |
| 13 | 8,192 | \(\times 8192\) |
| 14 | 16,384 | \(\times 16384\) |
| 15 | 32,768 | \(\times 32768\) |
| 16 | 65,536 | \(\times 65536\) (2 bytes) |
| 17 | 131,072 | |
| 18 | 262,144 | |
| 19 | 524,288 | |
| 20 | 1,048,576 | \(\times\) 1 MiB |
| 32 | 4,294,967,296 | límite de 32 bits |
| 63 | 9,223,372,036,854,775,808 | bit superior de un entero con signo de 64 bits |
Preguntas frecuentes
¿Puede un desplazamiento a la izquierda perder datos? Sí: los bits que se desplazan más allá del ancho del entero se descartan (desbordamiento). Dentro de los 64 bits, esta calculadora conserva el valor.
¿Qué pasa con los números negativos en un desplazamiento a la derecha? Esta calculadora aplica un desplazamiento aritmético (con signo) a la derecha, por lo que se conserva el bit de signo y los números negativos siguen siendo negativos.
¿Por qué usar desplazamientos en lugar de multiplicar o dividir? Los desplazamientos de bits son operaciones de un solo ciclo en la mayoría de las CPU, lo que los convierte en una forma rapidísima de multiplicar o dividir por potencias de dos.