jueves, 1 de diciembre de 2005

Clase IU_Principal [Algoritmo de Booth]


IU_Principal.java:
Esta clase implementará los métodos de manejo de interfaces y eventos, para visualizar las operaciones del algoritmo de Booth de una manera visualmente más atractiva.
A continuación, el detalle de lo que se usó para implementarlo.


Atributos:
  • private JButton btnCalcular;
    Es el botón con el cual se verifica que los datos ingresados sean correctos, y según eso, llama al algoritmo de Booth para calcular el resultado.
  • private JButton btnLimpiar;
    Limpia los campos de texto para ingresar una nueva operación.
  • private JTextArea txaOperaciones;
    Reporta paso a paso, las operaciones del algoritmo de Booth.
  • private JTextField txtMultiplicando;
    Donde se ingresa el valor en base decimal del multiplicando de la operación.
  • private JTextField txtMultiplicandoBin;
    Donde se reporta el multiplicando en binario.
  • private JTextField txtMultiplicador;
    Donde se ingresa el valor en base decimal del multiplicador de la operación.
  • private JTextField txtMultiplicadorBin;
    Donde se reporta el multiplicador en binario.
  • private JTextField txtMultiplicacion;
    Donde se reporta a manera de cadena, la operación de forma: "a x b".
  • private JTextField txtResultado;
    Donde se reporta el resultado de la operación, en base decimal.
  • private JTextField txtResultadoBin;
    Donde se reporta el resultado de la operación en binario.
Además, también hay etiquetas JLabel y un par de JPanel.

Métodos:
  • IU_Principal() : constructor
    Descripción: Inicializa todos los atributos, y ubicación en la interfaz de los elementos gráficos (Swing).
    Entrada: Cadena que representa un número en binario.
    Salida: Entero que representa el correspondiente valor en decimal.

  • btnCalcularActionPerformed(java.awt.event.ActionEvent evt) : void
    Descripción: Convierte un número decimal, a un número binario.
    Entrada: evento a manejar.
    Salida: Vacío.

  • btnLimpiarActionPerformed(java.awt.event.ActionEvent evt) : void
    Descripción: Establece los valores de los cuadros de texto en vacío, limpiándolos para realizar un nuevo cálculo, y poniendo el foco (requestFocus) en el txtMultiplicando.
    Entrada: evento a manejar.
    Salida: Vacío.

  • validarValoresEntrada() : boolean 
    Descripción: Verifica que los datos ingresados sean exclusivamente numéricos/enteros y no de ningún otro tipo. También verifica que (en este caso) sean menores de 256, para normalizar las cadenas de números binarios a 9 bits (8 normales + 1 bit de signo)
    Entrada: Vacío.
    Salida: Valor booleano, que indica si los datos ingresados son númericos/enteros, menores a 256 (verdadero) o no cumplen esas restricciones (devuelve falso).

  • actualizarTextArea(String cadena) : void
    Descripción: Actualiza el JTextArea txaOperaciones, añadiendo (append) la cadena de entrada.
    Entrada: Cadena de texto a ser reportada dentro del textArea, siendo añadida en la última línea.
    Salida: Vacío.
Una imagen de cómo se ve la interfaz, con la disposición de ubicación de botones, tamaños, etc.
Los campos de texto deshabilitados, son los de tipo "reporte" para que el usuario no los pueda modificar.

Clase AlgoritmoBooth [Algoritmo de Booth]


AlgoritmoBooth.java:
Esta clase implementará todos los métodos propios del algoritmo de Booth, que no estén considerados en la clase OperacionesBinarias.java.

Algunos métodos se trabajarán por sobrecarga (overloading) para simplificar codificación.
Los métodos son estáticos porque depende de ningún atributo de la clase (los cuales no tiene)


  • algoritmo(String multiplicando, String multiplicador) : String
    Descripción: Implementa el algoritmo de Booth, haciendo uso de todas las funciones previamente implementadas en la clase OperacionesBinarias para calcular el resultado correspondiente.
    Adicionalmente, muestra los datos, el procedimiento y operaciones, y el resultado en modo consola.
    Entrada: 2 cadenas representando números binarios.
    Salida: Cadena que representa el número binario del producto.

  • algoritmo(int multiplicando, int multiplicador) : int
    Descripción: Recibe los datos a operar del tipo entero, los convierte en binario (cadenas), los normaliza (en tamaño), llama a String:algoritmo con esos valores, y el valor retornado, lo transforma a entero y lo devuelve.
    Entrada: 2 enteros, números a operar.
    Salida: Entero, valor del resultado de la operación (producto).

  • algoritmo(IU_Principal interfaz, String multiplicando, String multiplicador) : String
    Descripción: Implementa el algoritmo de Booth, haciendo uso de todas las funciones implementadas en la clase OperacionesBinarias para calcular el resultado correspondiente.
    Adicionalmente, muestra los datos, el procedimiento y operaciones, y el resultado en modo consola, y utiliza el parámetro interfaz para actualizar el textArea donde reporta las operaciones del algoritmo.
    Entrada: 2 cadenas representando números binarios.
    Salida: Cadena que representa el número binario del producto.


Respecto al algoritmo principal, éste es el procedimiento:
Se le han suprimido los códigos de impresión, y formato de impresión para hacerlo legible, y enfocándome únicamente en el código del mismo algoritmo de Booth.

  1. public static String algoritmo(String multiplicando, String multiplicador)
  2. {
  3. String resultado="";
  4. String A=OperacionesBinarias.completarDerecha(multiplicando);
  5. String S=OperacionesBinarias.complementoA2(multiplicando);
  6. S=OperacionesBinarias.completarDerecha(S);
  7. String P=OperacionesBinarias.completarIzquierda(multiplicador);
  8. int i=0,n=multiplicando.length();
  9. char ultimo, penultimo;
  10. char cadena[]=new char[2*n];
  11. for(i=0;i<n;i++)
  12. {
  13. ultimo=P.charAt(P.length()-1);
  14. penultimo=P.charAt(P.length()-2);
  15. if(penultimo=='0' && ultimo=='0')
  16. {
  17. // No realizar ninguna acción
  18. }
  19. else
  20. {
  21. if(penultimo=='0' && ultimo=='1')
  22. {
  23. // P termina en [0 1] -> P = P + A
  24. P=OperacionesBinarias.suma(P, A);
  25. }
  26. else
  27. if(penultimo=='1' && ultimo=='0')
  28. {
  29. // P termina en [1 0] -> P = P + S = P - A
  30. P=OperacionesBinarias.suma(P, S);
  31. }
  32. else
  33. {
  34. // No realizar ninguna acción
  35. }
  36. }
  37. P=OperacionesBinarias.desplazarDerecha(P);
  38. }
  39. for(i=0;i<2*n;i++)
  40. {
  41. cadena[i]=P.charAt(i);
  42. }
  43. resultado=String.valueOf(cadena);
  44.  
  45. // devuelve el resultado, quitandole el ULTIMO bit
  46. return resultado;
  47. }


Clase OperacionesBinarias [Algoritmo de Booth]


OperacionesBinarias.java:
Es la clase que implementará todos los métodos (estáticos) que van a ser útiles para manipular números binarios.
Los métodos son estáticos porque depende de ningún atributo de la clase (los cuales no tiene)


  • bin2dec(String numeroBinario) : int
    Descripción: Convierte un número binario, a un número decimal.
    Entrada: Cadena que representa un número en binario.
    Salida: Entero que representa el correspondiente valor en decimal.

  • dec2bin(int numeroDecimal) : String
    Descripción: Convierte un número decimal, a un número binario.
    Entrada: Entero que representa el valor decimal del número.
    Salida: Cadena que representa el correspondiente valor en binario.

  • complementoA2(String binario) : String
    Descripción: Convierte un número binario a su representación en complemento a 2.
    Entrada: Cadena que representa un número en binario.
    Salida: Cadena que representa el número binario en complemento a 2.

  • rellenarCeros(String numeroBinario, int tamañoDeseado) : String
    Descripción: Estandariza los tamaños de las cadenas a tratar, a un tamaño deseado de bits.
    Entrada: Cadena que representa un número en binario, entero del tamaño deseado de la cadena.
    Salida: Cadena de tamaño estandarizado.

  • desplazarDerecha(String numeroBinario) : String
    Descripción: Método propio del algoritmo de Booth, desplaza los bits a la derecha, manteniendo el bit de signo.
    Entrada: Cadena que representa un número en binario.
    Salida: Cadena con sus bits desplazados.

  • suma(String sumando, String sumador) : String
    Descripción: Suma 2 números en binario (en cadenas)
    Entrada: 2 cadenas representando números binarios.
    Salida: Cadena que representa el número binario de la suma.

  • completarDerecha(String cadena) : String
    Descripción: Método propio del algoritmo de Booth, rellena de ceros a la derecha para darle a la cadena de entrada la forma del resultado (de n bits del dato de entrada, a 2n+1 bits del dato de salida)
    Entrada: Cadena representando un número binario.
    Salida: Cadena de longitud 2n+1, donde n+1 ceros adheridos a la derecha.

  • completarIzquierda(String cadena) : String
    Descripción: Método propio del algoritmo de Booth, rellena de ceros a la izquierda para darle a la cadena de entrada la forma del resultado (de n bits del dato de entrada, a 2n+1 bits del dato de salida)
    Entrada: Cadena representando un número binario.
    Salida: Cadena de longitud 2n+1, donde n+1 ceros adheridos a la izquierda.

  • formatoBinario(String cadena) : String
    Descripción: Método que separa cada 4 bits con un espacio " " el número binario, para darle mayor legibilidad.
    Entrada: Cadena representando un número binario.
    Salida: Cadena con formato binario legible.