Desplazamientos de Bits
Desplazamientos de Bits
Desplazamientos de Bits
Los desplazamientos de bit (bit shifts) son a veces considerados operaciones bit a bit,
porque operan en la representacin binaria de un nmero entero en vez de sobre su valor
numrico; sin embargo, los desplazamientos de bits no operan en pares de bits
correspondientes, y por lo tanto no pueden ser llamados propiamente como "bit a bit" (bitwise). En estas operaciones los dgitos (bits) son movidos, o desplazados, hacia la
izquierda o hacia la derecha. Los registros en un procesador de computador tienen un
ancho fijo, as que algunos bits sern desplazados hacia fuera ("shifted out"), es decir,
"salen" del registro por un extremo, mientras que el mismo nmero de bits son
desplazados hacia adentro ("shifted in"), es decir, "entran" por el otro extremo; las
diferencias entre los operadores de desplazamiento de bits estn en cmo stos
determinan los valores de los bits que entran al registro (desplazamiento hacia adentro)
(shifted-in).
Desplazamiento lgico[editar]
Artculo principal: Desplazamiento lgico
10110011
10110011
desplazamiento
1 <-- 0110011 <-- 0
0 --> 1011001 --> 1
01100110
01011001
desplazamiento
Desplazamiento
Desplazamiento
hacia la izquierda hacia la derecha
(hexadecimal
; EAX = EAX * 2
EAX = 2n
; desplaza a la
; EBX = EAX
EBX = 2n
; EBX = EBX * 2
EBX = 4n
; EBX = EBX * 2
EBX = 8n
; vuelve a multiplicar
obteniendo 4n
SHL EBX, 1
EAX = 2n + 8n = 10n
; suma EBX
Desplazamiento aritmtico[editar]
Artculo principal: Desplazamiento aritmtico
Los desplazamientos aritmticos son similares a los desplazamientos lgicos, solo que los
aritmticos estn pensados para trabajar sobre nmeros enteros con signo en
representacin de complemento a dos en lugar de enteros sin signo. Los desplazamientos
aritmticos permiten la multiplicacin y la divisin por dos, de nmeros enteros con signo,
por una potencia de dos. Desplazar n bits hacia la izquierda o a la derecha equivale a
multiplicar o dividir por 2n, (asumiendo que el valor no hace desbordamiento (overflow o
underflow)).
El desplazamiento aritmtico hacia la izquierda es exactamente igual al desplazamiento
lgico hacia la izquierda. De hecho son dos nombres diferentes para exactamente la
misma operacin. Al desplazar los bits una posicin hacia la izquierda es equivalente a una
multiplicacin por 2 independientemente de si es un nmero entero con signo o sin signo.
En los procesadores x86, el ensamblador tiene dos pnemnicos para el desplazamiento
lgico y el aritmtico hacia la izquierda, pero cuando el programa es ensamblado, solo hay
un opcode para ambos en la instruccin en lenguaje de mquina.
El desplazamiento aritmtico hacia la derecha es diferente al desplazamiento lgico hacia
la derecha. En los enteros sin signo, para dividir por 2, se debe usar el desplazamiento
lgico, el cual siempre agrega un 0 en el extremo izquierdo por cada desplazamiento de un
bit hacia la derecha. En cambio, en los enteros con signo, se debe usar el desplazamiento
aritmtico hacia la derecha, el cual copia el bit del signo (el bit ms significativo (MSB)) en
el espacio vaco que queda en el extremo izquierdo cada vez que se hace un
desplazamiento de un bit hacia la derecha. De esta manera, se divide efectivamente por 2
al entero con signo.
Si el entero con signo es positivo, (con el bit del signo igual a 0), se insertar el bit 0 del
signo en el extremo izquierdo al desplazar un bit hacia la derecha (igual que el
desplazamiento lgico hacia la derecha), pero si es un entero negativo, (con el bit del signo
igual a 1), se insertar el bit 1 del bit del signo en el extremo izquierdo. De esta manera, el
signo del nmero se preserva con la divisin por 2 y el nmero resultante tiene sentido. Si
se insertara un 0 a la izquierda a un nmero negativo (como lo hara el desplazamiento
lgico hacia la derecha), en primer lugar, este nmero negativo cambiara de signo a
positivo, y en segundo lugar, la interpretacin de los bits restantes no tendran sentido.
Estos ejemplos utilizan un registro de 8 bits:
00010111 (Decimal 23) (Desplazamiento aritmtico hacia la
izquierda de un nmero positivo)
Rotacin de bits[editar]
Rotacin[editar]
izquierda
derecha
acarreo
acarreo
Rotar a travs del bit del acarreo es similar a la operacin de rotar anterior (rotacin sin
acarreo). La diferencia est en que los dos extremos del registro estn unidos entre s a
travs delflag del acarreo, el cual queda en medio de ellos. El bit que sale por un extremo
va al flag del acarreo, y el bit original que estaba en el flag del acarreo entra al registro por
el extremo opuesto.
Si se fija el flag del acarreo de antemano, una rotacin simple a travs del acarreo puede
simular un desplazamiento lgico o aritmtico de una posicin. Por ejemplo, si el flag del
acarreo contiene 0, despus de una rotacin hacia la derecha a travs del flag del acarreo,
equivale a un desplazamiento lgico hacia la derecha, y si el flag del acarreo contiene una
copia del bit del signo, equivale a un desplazamiento aritmtico hacia la derecha. Por esta
razn, algunos microcontroladores tales como los PIC solo tienen las funciones de rotar y
rotar a travs del acarreo, y no se preocupan de tener instrucciones de desplazamiento
aritmtico o lgico.
Rotar a travs del acarreo es especialmente til cuando se hacen desplazamientos en
nmeros ms grandes que el tamao nativo de la palabra del procesador, porque si, por
ejemplo, un nmero grande es almacenado en dos registros y se quiere desplazar hacia la
derecha un bit, el bit que sale del extremo derecho del registro de la izquierda debe entrar
por el extremo izquierdo del registro de la derecha. Con rotacin a travs del acarreo, ese
bit es almacenado en el flag del acarreo durante el primer desplazamiento hacia la
derecha sobre el registro de la izquierda, listo para ser desplazado al registro de la
derecha usando una simple rotacin con acarreo hacia la derecha y sin usar ninguna
preparacin extra.