¿Qué es el desplazamiento binario y por qué lo usamos?

El desplazamiento binario como suena el nombre es una operación en la que desplaza los bits de un número. Existen principalmente dos operaciones: desplazamiento aritmético a la derecha (>>) y desplazamiento aritmético a la izquierda (<<).

Los números se almacenan en la memoria como una serie de bits. Por ejemplo, cuando toma un entero ( tipo int) , se representan como 32 bits en la memoria. Tome 8, en binario se representa así:

  8 = 0000 0000 0000 0000 0000 0000 1000

desplazamiento aritmético a la derecha

si haces 8 >> 1, desplazas todos los bits de 8 una posición a la derecha, lo que resulta en:

  0000 0000 0000 0000 0000 0000 0100 = 4

Una cosa a tener en cuenta aquí es que desplazar un número a la derecha es como si se dividiera por una potencia de 2 (4 = (8/2)).

desplazamiento aritmético a la izquierda

En cambio, si haces 8 << 1, desplazas todos los bits de 8 una posición a la izquierda, lo que resulta en:

  0000 0000 0000 0000 0000 0001 0000 = 16

En ella notamos que desplazar un número a la izquierda es como si multiplicaras por una potencia de 2 (16 = 8 * 2).

Una de las aplicaciones más importantes del desplazamiento binario es cuando desea realizar operaciones bit a bit; establecer o borrar un bit particular de un número, por ejemplo. Supongamos que tiene un número binario y desea borrar su tercer bit (desea tener 0 en el tercer bit), así es como puede hacerlo:

  0101 = 5
 0101 y (~ (1 << 2)) = 0101 y (~ (0100)) = 0101 y 1011 = 0001

Estas operaciones se usan mucho en la programación del sistema cuando se realizan manipulaciones particulares para acceder a registros o escribir un bit particular que tiene un uso específico.

Puedo darte algunos ejemplos. En C / C ++ y otros lenguajes le proporciona un medio para acceder a un byte (8 bits). Usualmente representado como un personaje. Si desea obtener un poco de ese carácter, tiene varias opciones, una de ellas es el desplazamiento binario (con otros operadores (xor, o, y)).

¿Ahora por qué?

Por lo general, para conservar la memoria. Un ejemplo que puedo darle es el bool en C / C ++, que generalmente se define como char. Pero espera, ¿no es un char 8 bits (generalmente)? ¿Por qué estamos expresando un valor que puede ser 1 o 0 como un carácter, no podríamos expresar, al menos 8 de los que usan un carácter? Sí, podemos, eso es lo que hace std :: vector . Y para lograrlo, debe cambiar los bits y escribir en cada uno de ellos.

Hay otros ejemplos, si observa el estándar para diferentes formatos, BMP, encabezados mpeg.

Referencia rápida de encabezados MPEG

Formato de archivo BMP – Wikipedia

Verá que esos tienen datos especificados en el nivel de bits, esto es para reducir la cantidad de datos que se está utilizando, tal vez para usted, guardar 3/4 bytes no es un gran problema, pero para los encabezados MPEG, imagine que los datos se transmiten para millones de personas y cada cuadro tiene un encabezado (o un par de cuadros), esto se convertirá en un gran problema.

¿Y cómo extraemos estos datos? Bitshift 🙂