viernes, 4 de octubre de 2013

Desplazar un número binario en Java

Bueno en esta entrada les enseñare, de una manera bastante sencilla, como hacer la operación de desplazamiento a nivel de bits en Java. Seguiremos el siguiente orden:
  1. ¿Qué es el desplazamiento de bits?.
  2. Desplazamiento a la derecha.
  3. Desplazamiento a la izquierda.
Así que, ¡manos a la obra!


¿Qué es el desplazamiento de bits?

La operación de desplazamiento se refiere a mover o desplazar los bits de un número a la derecha o a la izquierda. Por ejemplo, en la figura 1 y 2 se pueden observar el desplazamiento a la izquierda y derecha respectivamente:
Figura 1: Desplazamiento a la izquieda.

Figura 2: Desplazamiento a la derecha


Las imágenes, así como parte de la información, fueron tomados de esta fuente.

Desplazamiento de Bits a la Derecha en Java

Para el desplazamiento a la derecha usaremos dos operadores: >> y >>>. El primero de ellos es usado en el denominado desplazamiento a la derecha con signo, mientras que el segundo se usa en el desplazamiento a la derecha sin signo. La única diferencia es que el primero tiene en cuenta el signo del número (bit 32), y según este rellenará con un 1 o con un 0 al desplazar.

En el siguiente es un ejemplo  de desplazamiento a la derecha con signo:
 
public class PruebasBlog {
    public static void main(String[] args) {
        int numero = 21;
        int numeroRotadoDerecha = numero >> 1;
        System.out.println("Número original en binario: " + Integer.toBinaryString(numero));
        System.out.println("Número rotado en binario    " + Integer.toBinaryString(numeroRotadoDerecha));
    }
}

El desplazamiento como tal se da en la linea:
 
        int numeroRotadoDerecha = numero >> 1;

En donde el uno que sigue al operados >> indica el número de corrimientos a hacer. El resultado será:
 
Número original en binario: 10101
Número rotado en binario:   1010

Es interesante notar que, los bits desplazados, son remplazados con un 0, ya que el signo del número es positivo. ¿Qué ocurre al trabajar con un número negativo?, veamos el siguiente ejemplo:
 
public class PruebasBlog {
    public static void main(String[] args) {
        int numero = -1;
        int numeroRotadoDerecha = numero >> 1;
        System.out.println("Número original en binario: " + Integer.toBinaryString(numero));
        System.out.println("Número rotado en binario    " + Integer.toBinaryString(numeroRotadoDerecha));
    }
}

En este caso el resultado es:
 
Número original en binario: 11111111111111111111111111111111
Número rotado en binario:   11111111111111111111111111111111

¡No ha cambiado el número!. Y la razón es muy sencilla: los espacios que se generan en el desplazamiento, dado que el número original es negativo, son rellenados con un 1 y no con un 0 como ocurria antes.

Corramos de nuevo el ejemplo anterior, pero esta vez sustituyamos el operados >> por >>>:
 
public class PruebasBlog {
    public static void main(String[] args) {
        int numero = -1;
        int numeroRotadoDerecha = numero >>> 2;
        System.out.println("Número original en binario: " + Integer.toBinaryString(numero));
        System.out.println("Número rotado en binario:   " + Integer.toBinaryString(numeroRotadoDerecha));
    }
}

En este caso el resultado es:
 
Número original en binario: 11111111111111111111111111111111
Número rotado en binario:   111111111111111111111111111111

Y como vemos, en este caso el número si ha variado. Esto sucede porque el operador >>> no tiene en cuenta el signo y simplemente rellena los "huecos" generados al desplazar con 0.

Desplazamiento de Bits a la Izquierda en Java

El desplazamiento a la izquierda es similar al de derecha, pero esta vez usaremos el operador <<. El desplazamiento a la izquierda siempre será sin signo, o en otras palabras, siempre se llenaran los "huecos" con 0.

Veamos un ejemplo de rotación a la izquierda:
 
public class PruebasBlog {
    public static void main(String[] args) {
        int numero = 21;
        int numeroRotadoIzquierda = numero << 1;
        System.out.println("Número original en binario: " + Integer.toBinaryString(numero));
        System.out.println("Número rotado en binario:  " + Integer.toBinaryString(numeroRotadoIzquierda));
    }
}

Y el resultado será:
 
Número original en binario: 10101
Número rotado en binario:  101010

No hay comentarios:

Publicar un comentario