6.5. Operaciones de bits.

Vamos a implementar dos operaciones de bits: el desplazamiento a la derecha y el desplazamiento a la izquierda, también conocidos como corrimientos. Para estas poder hacerlo, vamos a utilizar los operadores predefinidos de Pascal (shr y shl).

Un desplazamiento a la izquierda equivale a mover todos los dígitos una posición a la izquierda, agregando un cero al principio del número (en la cifra menos significativa); mientras que desplazar a la derecha equivale a mover todos los dígitos a derecha, desechando el primer dígito a la derecha. El desplazamiento a la izquierda equivale a multiplicar por la base, mientras que el de a la derecha equivale a dividir por la base. Como estamos utilizando los operadores predefinidos de Pascal, la base que utiliza es dos. Aunque no parezcan tener importancia estas funciones, en varios de los siguientes algoritmos veremos su utilidad.

Para la implementación, lo único que debemos hacer es realizar en cada bloque la operación correspondiente, haciendo ajustes según se requiera.

En el caso del desplazamiento a la izquierda, lo que estamos haciendo es multiplicar por dos el bloque, por lo que el resultado puede exceder el tamaño de la base. En caso de que suceda, el ajuste que hacemos es restarle al bloque la base e incrementar el siguiente bloque en uno. Por ejemplo: supongamos que estamos utilizando como base 10 (esto implica bloques de tamaño 1) y que vamos a desplazar el número 29. La operación nos arroja como resultado 18 en el primer bloque y 4 en el segundo. Como el primer bloque es mayor que la base, lo decrementamos en 10 e incrementamos el siguiente. De esta forma tendríamos 8 en el primer bloque y 5 en el segundo, con lo que el resultado sería el correcto. Es importante notar que incrementamos el siguiente bloque después de haberlo desplazado.

Para el desplazamiento a la derecha, el ajuste lo realizaremos cuando el bloque a desplazar es impar. En esta situación lo que hacemos es incrementar el bloque anterior por la base antes de que realicemos el desplazamiento en ese bloque. Esto se hace porque esta operación es equivalente a dividir entre dos, y cuando el bloque es impar nos arroja un residuo que es el que incrementamos al bloque anterior. Lo podemos ver de manera más clara con un ejemplo: si tenemos de base 10 y vamos a desplazar el número 58, el resultado de desplazar el segundo bloque sería 2 y tendríamos de residuo 1. Este residuo lo multiplicamos por la base y se lo agregamos al bloque anterior (el 8). En base 2 como el residuo sólo puede ser 1, podemos evitarnos la multiplicación. Con esto, ahora el bloque anterior tiene un 18 y al aplicar el corrimiento obtenemos 9.


Entre las líneas 1 y 15 tenemos el procedimiento shift_l, el cual se encarga de recorrer un número a la izquierda. Realizamos la  operación del bloque más al menos significativo y hacemos el ajuste en caso de que sea necesario. En caso de que el último bloque sea muy grande, puede requerir que ajustemos el tamaño del número.

El procedimiento shift_r (líneas 17 a 29) desplaza el parámetro a la derecha. Este desplazamiento también lo realizamos del bloque más al menos significativo. El primer bloque lo procesamos aparte porque no requiere ajuste. Si sucede que el último bloque se vuelva cero, decrementamos el tamaño del número.


Código en C






© Pier Paolo Guillen Hernandez
World of πer