RE:Desplazamiento de bits
Hola. Supongamos que tienes lo siguiente:
int i = 39;
Como sabrás, todas las variables están compuestas de bits, y son éstos quienes mantienen el valor. En el caso anterior (en un compilador estándar de 32 bits), i tiene 16 bits (por ser de tipo int). Entonces la variable se vería así:
0000000000100111
El desplazamiento de bits se refiere... a desplazar bits. Por ejemplo:
i >> 1;
"movería" todos los bits una posición hacia la derecha. Osea, que nuestra variable quedaría como:
0000000000010011
cuyo valor en decimal es 19. De igual forma, si en lugar de lo anterior ponemos:
i << 1;
movemos la variable una posición a la izquierda:
0000000001001110
donde el valor es 78. Y así te sigues.
Ahora, quizás la pregunta importante es... ¿y para qué cuernos quiero desplazar los bits? En primera instancia, un shift a la izquierda es equivalente a multiplicar el valor por 2, mientras que el shift a la derecha es equivalente a dividir entre dos. Por ejemplo, supongamos que tenemos una variable que guarda el tamaño de un disco duro, y tienes el tamaño en bytes. Y tú lo quieres representar en kilobytes. Pues bastaría dividir entre 1024, ¿no? Entonces podrías hacer algo como:
int kb = bytes / (1<<10); // 2*2*2*2*2*2*2*2*2*2 = 1024
en lugar de
int kb = bytes / 1024;
Para muchos programadores eso sería más legible. Sobre todo cuando trabajas con máscaras de bits:
const int valor0 = 1; // 1 => 0001
const int valor1 = 1<<1; // 2 => 0010
const int valor2 = 1<<2; // 4 => 0100
const int valor3 = 1<<3; // 8 => 1000
int valor = valor4 | valor 2; // 10 => 1010
Etcétera.
Estas operaciones se usan mucho más cuando se trabaja a muy bajo nivel --digamos, al hacer drivers y dispositivos electrónicos. El siguiente es un ejemplo que me encontré por ahí, con el que podrías multiplicar dos números con puras operaciones lógicas a nivel de bits:
int multiplicar(int a, int b)
{
int c = 0;
while (b)
{
if (b & 1)
c += a;
a << 1;
b >> 1;
}
return c;
}
Y a veces, cuando trabajas a bajo nivel, tienes que trabajar así.
En fin, en general es raro que a uno le toque trabajar con los operadores shift. A mí me gusta mucho emplear máscaras de bits, pero asigno el valor tal cuál (1, 2, 4, 8, etc). Pero pos supongo que habrá quienes sí lo usen todavía.
Saludos.