sábado, 5 de octubre de 2013

Rotar un número binario en Java

Ya en una entrada pasada había mostrado como desplazar bits en un binario, así que en esta les mostraré una forma sencilla de rotar un número binario en Java. Para ello seguiré el siguiente orden:
  1. ¿Qué es la rotación en binarios?.
  2. Rotación a la derecha. 
  3. Rotación a la izquierda.
Así que empecemos.


¿Qué es la rotación en binarios?

La operación de rotación de rotación de bits es, de manera general, un desplazamiento circular. Es decir, los bits se desplazan como si los extremos izquierdo y derecho del número binario estuvieran conectados. En la figura 1 podemos ver la rotación a la derecha.

Figura 1: Rotación a la derecha.
Como se observa en la anterior figura, en la rotación a la derecha, el bit que sale por el extremo derecho entrará por el extremo izquierdo. En la figura 2 se observa la rotación a la izquieda.

Figura 2: Rotación a la izquierda
Y de la anterior figura se aprecia que, en la rotación a la izquierda, el bit que sale por el extremo izquierdo entrará por el derecho.

Si quieres saber más sobre la rotación, puedes visitar este enlace, de ahí saque las imágenes y parte de la información.

Rotación a la derecha

Para la operación de rotación he usado, por facilidad, la concatenación en Strings. Si no sabes a que me refiero, basta con que sepas que se trata de "pegar" o "unir" dos Strings. Por ejemplo, en el siguiente código la variable c es igual a la concatenación de la variable a con la variable b, es decir, es igual a "ab":
 
String a = "a";
String b = "b"
String c = a + b;

Utilizo además la función substring(), que me permite extraer una parte de un String. Funciona de la siguiente manera:
 
String a = "012345";
//substring(int indiceComienzo, int indiceFinal)
String c = a.substring(0, 2);

En este caso la variable c será igual a "01", ya que substring() me extrae desde el elemento 0 de a (incluyéndolo), hasta el elemento 2 (sin incluirlo).

La última función que es importante conocer es charAt(), que me extrae un carácter específico de un String mediante su índice.

Ahora veamos el código completo del programa:
 
public class PruebasBlog {
    public static void main(String[] args) {
        Scanner entrada = new Scanner(System.in);
        String binario;
        int numero;
        System.out.println("Ingrese el numero binario de máx 31 bits: ");
        binario = entrada.next();
        try {
            // Verifico que el binario ingresado sea válido
            numero = Integer.parseInt(binario, 2);
            do {
                binario = rotarDerecha(binario);
                System.out.println("Rotacion derecha: " + binario);
                System.out.println("Presione 's' para continuar rotando, u otra tecla para salir:");
            } while (entrada.next().equals("s"));
        } catch (NumberFormatException e) {
            System.out.println("Ha ingresado un numero invalido");
        }
    }

    /**
     * Esta función realiza una rotación a la derecha, por ejemplo: 10010 se
     * convertirá en 01001
     * @param binario
     * @return binario rotado a la derecha
     */
    public static String rotarDerecha(String binario) {
        String binarioRotado;
        binarioRotado = binario.charAt(binario.length() - 1) + binario.substring(0, binario.length() - 1);
        return binarioRotado;
    }
}

El programa funciona así:
  1. Pide al usuario ingresar un número binario. Esto se hace mediante la clase Scanner; si desean saber más sobre Scanner pueden visitar este link.
  2. El programa verifica que el número binario ingresado es válido. Para ello se usa el bloque try-catch, y un intento de parseo al entero numero. De una manera sencilla, podemos decir que si el número ingresado es correcto se ejecuta el bloque de código dentro del try, pero si no es correcto, se ejecuta el bloque de código dentro del catch.
  3. Finalmente, es la función rotarDerecha() la encargada de rotar el binario. En esta operación se usa la concatenación de la que hablé antes. 
  4. Se le pregunta al usuario si desea seguir rotando el número: si presiona la letra 's', se repite desde el paso 3. Si presiona cualquier otra tecla, como por ejemplo 'f'', el programa se detiene.
Veamos un ejemplo del programa corriendo:
 
Ingrese el numero binario de máx 31 bits: 
100110
Rotacion derecha: 010011
Presione 's' para continuar rotando, u otra tecla para salir:
s
Rotacion derecha: 101001
Presione 's' para continuar rotando, u otra tecla para salir:
f

Si la persona no ingresa un número binario válido, la salida será así:
 
Ingrese el numero binario de máx 31 bits: 
23Adsd
Ha ingresado un numero invalido

Rotación a la Izquierda

El programa de rotación a la izquierda es en esencia el mismo de rotación a la derecha. La única diferencia es el uso de la función rotarIzquierda(). Esta función vuelve a usar el concepto de concatenación, solamente cambia la manera de hacerlo. Veamos el código:


 
public class PruebasBlog {
    public static void main(String[] args) {
        Scanner entrada = new Scanner(System.in);
        String binario;
        int numero;
        System.out.println("Ingrese el numero binario de máx 31 bits: ");
        binario = entrada.next();
        try {
            // Verifico que el binario ingresado sea válido
            numero = Integer.parseInt(binario, 2);
            do {
                binario = rotarIzquierda(binario);
                System.out.println("Rotacion izquierda: " + binario);
                System.out.println("Presione 's' para continuar rotando, u otra tecla para salir");
            } while (entrada.next().equals("s"));
        } catch (NumberFormatException e) {
            System.out.println("Ha ingresado un numero invalido");
        }
    }

    /**
     * Esta función realiza una rotación a la izquierda, por ejemplo: 10010 se
     * convertirá en 00101
     * @param binario
     * @return binario rotado a la izquierda
     */
    public static String rotarIzquierda(String binario){
        String binarioRotado;
        binarioRotado = binario.substring(1) + binario.charAt(0);
        return binarioRotado;
    }
}

Si son detallistas habrán notado que la función substring() es usada un poco diferente. En este caso, en vez de pasarle dos enteros como parámetros se le pasa uno solo; ¿por qué?, la respuesta es sencilla, si se le pasa un solo parámetro, la función substring() nos creara el nuevo String desde ese elemento hasta el final del String original.

Veamos un ejemplo del programa corriendo:
 
Ingrese el numero binario de máx 31 bits: 
1001110
Rotacion izquierda: 0011101
Presione 's' para continuar rotando, u otra tecla para salir
s
Rotacion izquierda: 0111010
Presione 's' para continuar rotando, u otra tecla para salir
f

Con esto terminamos esta entrada. Espero que la información haya sido de utilidad para ustedes.

No hay comentarios:

Publicar un comentario