C/Visual C - Desplazamiento de bits

 
Vista:

Desplazamiento de bits

Publicado por Cajcoj (1 intervención) el 20/12/2007 01:36:58
Me interesa saber, a qué se refieren los manuales cuando hablan de desplazamiento de bits. Mil veces he leído de los operadores de bits, y hasta la fecha no sé de que se trata y por tanto tampoco he podido hacer uso de ello. Si alguien me lo puede explicar sería excelente.

Saludos.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Desplazamiento de bits

Publicado por fernando.gomez (1603 intervenciones) el 20/12/2007 18:35:37
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.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Desplazamiento de bits

Publicado por carlos (1 intervención) el 30/10/2009 17:21:19
Gracias! te juro que es la primera vez que encuentro una explicacion facil de entender.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar