Desplazamientos de bits [editar ] Los desplazamientos de bit (bit shifts) son a veces considerados operaciones bit a bit, porque operan en la representación binaria de un número entero en vez de sobre su valor numérico; sin embaro, los desplazamientos de bits no operan en pares de bits correspondientes, ! por lo tanto no pueden ser llamados propiamente como "bit a bit" (bit# $ise)% &n estas operaciones los d'itos (bits) son movidos, o desplazados, hacia la izquierda o hacia la derecha% Los reistros en un procesador de computador tienen un ancho fio, as' que alunos a lunos bits ser*n desplazados hacia fu era+ ("shifted out"), es decir, "salen" del reistro por un etremo, mientras que el mismo número de b its son desplazados hacia adentro+ ("shifted in"), es decir, "entran" por el otro etremo; las diferencias entre los operadores de desplazamiento de bits est*n en cómo éstos determinan los valores de los bits que entran al reistro (desplazamiento hacia adentro) (shifted#in)% Desplazamiento lógico[editar ] Artículo principal: -esplazamiento lóico
-esplazamiento lóico hacia la izquierda
-esplazamiento lóico hacia la derecha
.a! dos desplazamientos lóicos (loical shifts)% &l desplazamiento lóico hacia la izquierda (left shift) ! el desplazamiento lóico hacia la derecha (riht shift)% &n el desplazamiento lóico los bits de un reistro son desplazados (movidos) una o m*s posiciones hacia la derecha o hacia la izquierda% Los bit que salen del reistro por un etremo se pierden ! en el otro etremo del reistro se rellena con un bit cero por cada bit desplazado% /or eemplo% 0i se tiene en un reistro de 1 bits el valor 23223322, 23223322, ! se hace un desplazamiento hacia la izquierda de un bit, todos los bits se mueven una posición hacia la izquierda, el bit de la izquierda se pierde ! entra un bit cero de relleno por el lado derecho% &n un desplazamiento de un bit hacia la derecha ocurre alo an*loo, el bit de la derecha se pierde ! el de la izquierda se rellena con un cero4
10110011
10110011
<-- Bits antes del
desplazamiento 1 <-- 0110011 <-- 0
0 --> 1011001 --> 1
01100110
01011001
<-- Desplazamiento <-- Bits después del
desplazamiento Desplazamiento
Desplazamiento
hacia la izquierda hacia la derecha
&n determinados procesadores, queda almacenado el último bit que salió con el desplazamiento del reistro% &n la serie de los procesadores 15 dicho bit queda almacenado en el fla del acarreo% Moviendo bits[editar ] &l desplazamiento lóico se usa para mover bits hacia la izquierda o hacia la derecha para colocarlos en la posición adecuada% /or eemplo, suponamos que tenemos, en dos reistros del tama6o de un b!te, a dos d'itos headecimales (en representación binaria de 7 bits cada uno), ! se quiere empaquetarlos en un solo b!te, donde los 7 bits superiores es el headecimal m*s sinificativo ! los 7 bits inferiores es e l headecimal menos sinificativo4 0000 1001
<-- Dígito hexadecimal más significatio
!hexadecimal
"# 0000 1010
<-- Dígito hexadecimal menos significatio !hexadecimal
$#
/ara empaquetarlos en un solo b!te, primero ha! que desplazar el headecimal m*s sinificativo 7 posiciones hacia la izquierda% (&sto se hace con el desplazamiento lóico hacia la izquierda)4 1001 0000
<-- hexadecimal "% desplazado & 'its hacia la izquierda
para colocarlo en la posici(n correcta dentro del ')te
Lueo, se hace un 89 de los dos valores que contienen los d'itos headecimales para que queden combinados en un solo b!te4
0000 1010
+, 1001 0000
<-- *exadecimal menos significatio $ <-- +, con el hexadecimal más significatio "% el
cual )a está en su posici(n 1001 1010
<-- B)te con los dos hexadecimales empaquetados
!hexadecimal "$#
:hora tenemos un b!te con el valor de 2332 2323, el cual tiene los dos d'itos headecimales empaquetados% Multiplicación y división por 2 n, de enteros sin signo [editar ] &n números enteros sin sino, el desplazamiento lóico hacia la izquierda equivale a una multiplicación por ! el desplazamiento lóico hacia la derecha equivale a una división por
% &n la división (desplazamiento hacia la derecha), se pierde el bit menos sinificativo, dando como resultado un truncamiento del resultado (redondeo hacia abao, hacia menos infinito)% :s', 5 < es iual a =, pero > < es iual a =,?, pero el 3,? se pierde quedando el resultado en =% Los proramadores de lenuae ensamblador usan esta propiedad para hacer multiplicaciones ! divisiones r*pidas, de enteros sin sino, por una potencia de , en donde n desplazamientos equivalen a multiplicar o dividir por n% @ambién, si el procesador no tiene operaciones de multiplicación ! división de enteros, o si éstas son mu! lentas, se puede multiplicar o dividir usando desplazamientos ! sumas para multiplicar ! desplazamientos ! restas para dividir% /or eemplo, para multiplicar un entero por 23, se procede como siue (en el lenuae ensamblador del 15)4 0e quiere multiplicar el contenido del reistro &:A por 234 &n las instrucciones de abao, &:A ! &BA son reistros del procesador, 0.L (shift left), desplaza el reistro indicado una posición (un bit) hacia la izquierda (que equivale a multiplicar por ), C8D copia el reistro de la derecha sobre el reistro de la izquierda, ! :-- suma el reistro de la derecha al reistro de la izquierda%
*. /$% 1
/$ 2 /$ 3 4
/$ 2 4n
desplaza a la
izquierda el contenido del registro /$ una posici(n% !multiplica /$ por 4# 5+6 /B% /$
/B 2 /$
/B 2 4n
copia el registro /$
en /B% ahora los dos registros tienen 4n *. /B% 1
/B 2 /B 3 4
/B 2 &n
multiplica /B por 4%
/B 2 /B 3 4
/B 2 7n
uele a multiplicar
o'teniendo &n *. /B% 1
/B por 4% o'teniendo 7n $DD /$% /B
/$ 2 /$ 8 /B
/$ 2 4n 8 7n 2 10n
suma /B
!7n# a /$ !4n#% !ahora /$ tiene el alor original multiplicado por 10#
Desplazamiento aritmético[editar ] Artículo principal: -esplazamiento aritmético
-esplazamiento aritmético hacia la izquierda
-esplazamiento aritmético hacia la derecha
Los desplazamientos aritméticos son similares a los desplazamientos lóicos, solo que los aritméticos est*n pensados para trabaar sobre números enteros con sino en representación de complemento a dos en luar de enteros sin sino% Los desplazamientos aritméticos permiten la multiplicación ! la división por dos, de números enteros con sino, por una potencia de dos% -esplazar n bits hacia la izquierda o a la derecha equivale a multiplicar o dividir por n, (asumiendo que el valor no hace desbordamiento (overflo$ o underflo$))% &l desplazamiento aritmético hacia la izquierda es eactamente iual al desplazamiento lóico hacia la izquierda% -e hecho son dos nombres diferentes para eactamente la misma operación% :l desplazar los bits una posición hacia la izquierda es equivalente a una multiplicación por independientemente de si es un número entero con sino o sin sino% &n los procesadores 15, el ensamblador tiene dos pnemónicos para el desplazamiento lóico ! el aritmético hacia la izquierda, pero cuando el prorama es ensamblado, solo ha! un opcode para ambos en la instrucción en lenuae de m*quina% &l desplazamiento aritmético hacia la derecha es diferente al desplazamiento lóico hacia la derecha% &n los enteros sin sino, para dividir por , se debe usar el desplazamiento lóico, el cual siempre area un 3 en el etremo izquierdo por cada desplazamiento de un bit hacia la derecha% &n cambio, en los enteros con sino, se debe usar el desplazamiento aritmético hacia la derecha, el cual copia el bit del sino (el bit m*s sinificativo (C0B)) en el espacio vac'o que queda en el etremo izquierdo cada vez que se hace un desplazamiento de un bit hacia la derecha% -e esta manera, se divide efectivamente por al entero con sino% 0i el entero con sino es positivo, (con el bit del sino iual a 3), se insertar* el bit 3 del sino en el etremo izquierdo al desplazar un bit hacia la derecha (iual que el desplazamiento lóico hacia la derecha), pero si es un entero neativo, (con el bit del sino iual a 2), se insertar* el bit 2 del bit del sino en el etremo izquierdo% -e esta manera, el sino del número se preserva con la división por ! el número resultante tiene sentido% 0i se insertara un 3 a la izquierda a un número neativo (como lo har'a el desplazamiento lóico hacia la derecha), en primer luar, este número neativo cambiar'a de sino a positivo, ! en seundo luar, la interpretación de los bits restantes no tendr'an sentido% &stos eemplos utilizan un reistro de 1 bits4 00010111 !Decimal 49# !Desplazamiento aritmético hacia la izquierda de un n:mero positio#
2 00101110 !Decimal &;# !/l 'it de la izquierda se pierde ) un 'it 0 se aade a la derecha# 11010111 !Decimal -&1# !Desplazamiento aritmético hacia la izquierda de un n:mero negatio# 2 10101110 !Decimal -74# !/l 'it de la izquierda se pierde ) un 'it 0 se aade a la derecha# 00010111 !Decimal 49# !Desplazamiento aritmético hacia la derecha de un n:mero positio# 2 00001011 !Decimal 11# !/l 'it de la derecha se pierde ) el 'it del signo anterior se consera en el resultado#
11010111 !Decimal -&1# !Desplazamiento aritmético hacia la derecha de un n:mero negatio# 2 11101011 !Decimal -41# !/l 'it de la derecha se pierde ) el 'it del signo anterior se consera en el resultado#
0i el número binario es tratado como complemento a 2, entonces la misma operación de desplazamiento hacia la derecha resulta en una división por n redondeando hacia el cero%
Rotación de bits [editar ] Rotación[editar ]
-esplazamiento o rotación circular hacia la
-esplazamiento o rotación circular hacia la
izquierda
derecha
Artículo principal: -esplazamiento circular
8tra forma de desplazamiento es el desplazamiento circular o rotación de bits% &n esta operación, los bits de un reistro son rotados+ de una manera circular como si los etremos izquierdo ! derecho del reistro estuvieran conectados% &n la rotación hacia la izquierda, el bit que sale por el etremo izquierdo entrar* por el etremo derecho, ! viceversa con la rotación hacia la derecha% &sta operación es útil si es necesario conservar todos los bits eistentes, ! es frecuentemente usada en criptoraf'a diital% Rotación a través del bit del acarreo [editar ]
9otación hacia la izquierda a través del bit del
9otación hacia la derecha a través del bit del
acarreo
acarreo
9otar a través del bit del acarreo es similar a la operación de rotar anterior (rotación sin acarreo)% La diferencia est* en que los dos etremos del reistro est*n unidos entre s' a través delfla del acarreo, el cual queda en medio de ellos% &l bit que sale por un etremo va al fla del acarreo, ! el bit oriinal que estaba en el fla del acarreo entra al reistro por el etremo opuesto% 0i se fia el fla del acarreo de antemano, una rotación simple a través del acarreo puede simular un desplazamiento lóico o aritmético de una posición% /or eemplo, si el fla del acarreo contiene 3, después de una rotación hacia la derecha a través del fla del acarreo, equivale a un desplazamiento lóico hacia la derecha, ! si el fla del acarreo contiene una copia del bit del sino, equivale a un desplazamiento aritmético hacia la derecha% /or esta razón, alunos microcontroladores tales como los /EF solo tienen las funciones de rotar ! rotar a través del acarreo, ! no se preocupan de tener instrucciones de desplazamiento aritmético o lóico% 9otar a través del acarreo es especialmente útil cuando se hacen desplazamientos en números m*s randes que el tama6o nativo de la palabra del procesador, porque si, por eemplo, un número rande es almacenado en dos reistros ! se quiere desplazar hacia la derecha un bit, el bit que sale del etremo derecho del reistro de la izquierda debe entrar por el etremo izquierdo del reistro de la derecha% Fon rotación a través del acarreo, ese bit es almacenado+ en el fla del acarreo durante el primer desplazamiento hacia la derecha sobre el reistro de la izquierda, listo para ser desplazado al reistro de la derecha usando una simple rotación con acarreo hacia la derecha ! sin usar ninuna preparación etra%