Multiplicación mediante el algoritmo de Booth

February 2, 2008 at 11:27 am | In Rutinas | 19 Comments

El algoritmo de booth es un algoritmo que sirve para multiplicar (y dividir) números binarios con signo de manera rápida y sencilla en complemento a dos. Aqui explico de manera detallada el funcionamiento de ese algoritmo y muestro una implementacion del mismo para microcontroladores PIC.

La manera en que se representan los números binarios negativos es mediante su complemento a dos. El complemento a uno consiste en invertir el valor de cada bit, esto es que si se tiene el número 5 binario b’00000101′ su complemento a uno sería b’11111010′. Una vez teniendo el complemento a 1 para obtener el complemento a dos simplemente se le debe sumar un 1, asi que se tiene b’11111010 + 1′ de modo que el complemento a dos del número 5 binario es b’11111011′.

Ese es un dato muy importante ya que de ese modo se representan los números binarios negativos y el complemento a dos es parte del algoritmo de multiplicación de Booth. También es importante explicar que utilizando números de 8 bits el número mayor que se puede representar en complemento a dos es 127 y -127 que en binario son b’01111111′ y b’1000001′ respectivamente.

En ensamblador MPASM la manera de obtener el complemento a dos de un número es:
comf NUM,f
incf NUM,w
movwf NUMC2

donde NUM es el registro en el que se encuentra el número que se quiere pasar a complemento a dos y NUMC2 es el registro donde se guarda el complemento a dos del número. Hasta ahí todo bien, ahora pasemos al algorítmo.

Supongamos que queremos multiplicar dos números de 8 bits, digamos que queremos multiplicar 5*(-6) donde 5 es el multiplicando y -6 es el multiplicador, con esos datos se forman 3 arreglos distintos de la siguiente manera:

A=0000 0101 0000 0000 0
S=1111 1010 0000 0000 0
P=0000 0000 1111 1010 0

El byte superior de A está formado por el multiplicando, el siguiente byte se forma con ceros y se agrega un bit extra que también es 0.

El byte superior de S está formado por el complemento a dos del multiplicando, el siguiente byte al igual que el caso anterior se forma con ceros y al final se agrega un bit extra que es 0.

El byte superior de P está formado por ceros, el siguiente byte es el valor del multiplicador y por ultimo se tiene el bit extra.

Se puede observar que los tres números formados son de 17 bits cuando los números que se van a multiplicar son de 8 de modo que los números formados siempre serán de N+1 bits, siendo N el número de bits de los factores.

Sigamos entonces. Este algorítmo consiste en comparar los últimos dos digitos del número P y dependiendo de el caso que sea realizar un suma o no realizar ninguna acción. Luego de evaluar cada caso se debe realizar un corrimiento a la derecha, manteniendo el valor del bit más significativo y desechando el valor del bit menos significativo. Los cuatro casos que se tienen se pueden ver en la siguiente tabla:

0 0 -> No realizar ninguna acción
0 1 -> P = P + A
1 0 -> P = P + S
1 1 -> No realizar ninguna acción

Veamos el algoritmo paso a paso usando los numeros A, S y P de arriba. Primero tenemos el numero P original:

0000 0000 1111 101[0 0] P

Se comparan los ultimos dos digitos [0 0] con los cuatro casos posibles y se ve que no se debe realizar ninguna accion por lo que en la primer iteracion simplemente se realiza un corrimiento a la derecha:

1.
0000 0000 0111 110[1 0] ->

Ahora los ultimos dos digitos [1 0] indican que se debe realizar la suma P=P+S y despues el corrimiento a la derecha:

2.
1111 1011 0111 110[1 0] P=P+S

1111 1101 1011 111[0 1] ->

Despues del corrimiento los ultimos dos digitos son [0 1] por lo que se debe realizar la suma P=P+A y despues el corrimiento a la derecha:

3.
0000 0010 1011 111[0 1] P=P+A

0000 0001 0101 111[1 0] ->

Ahora los ultimos dos digitos son [1 0], se realiza la suma P=P+S y despues el corrimiento a la derecha:

4.
1111 1100 0101 111[1 0] P=P+S
1111 1110 0010 111[1 1] ->

Los ultimos dos digitos [1 1] al igual que cuando fueron [0 0] indican que solo se debe realizar el corrimiento a la derecha:

5.
1111 1111 0001 011[1 1] ->

De nuevo se tiene [1 1] por lo que se realiza unicamente el corrimiento y en lo sucesivo se tendra siempre el mismo caso:

6. 1111 1111 1000 101[1 1] ->
7. 1111 1111 1100 010[1 1] ->
8. 1111 1111 1110 0010 [1] ->

Despues de 8 iteraciones termina el algoritmo, se desecha el bit menos significativo (el bit extra) y se obtiene el producto de la multiplicacion:
5*(-6) = 1111 1111 1110 0010 = -30

Cabe mencionar que el numero de iteraciones que realiza el algoritmo es igual N, que es el numero de bits de los factores y el resultado final es igual a 2N, en este caso se multiplican factores de 8 bits por lo que el resultado final es de 16.

Esta es la manera en la que funciona el algoritmo. Solamente hay que tener en cuenta que al realizar los corrimientos a la derecha se debe mantener siempre el bit mas significativo, esto es que si se tiene ‘1101′ y se realiza el corrimiento el resultado sera ‘1110′ y no ‘0110′.

Implementacion del algoritmo de Booth en MPASM

Aplicando los pasos que acabo de explicar realice una implementacion del algoritmo de Booth para la multiplicacion en MPASM para realizar multiplicaciones de numeros signados de 8 bits en microcontroladores PIC 16F.

El algoritmo implementado sigue los mismos pasos descritos, compara los ultimos dos digitos del factor P y realiza alguna de las acciones posibles para despues llevar acabo el corrimiento. Como mencione en un principio el algoritmo solo puede multiplicar numeros que van del -127 al 127 y el resultado lo da a traves de los registros RESULTADOH:RESULTADOL.

Para poder utilizar esta rutina (multibooth) se deben declarar los registros A1, A2, A3, S1, S2, S3, P1, P2, P3, MULTIPLICANDO, MULTIPLICADOR, RESULTADOH, RESULTADOL y CONT.

En los registros RESULTADOH:RESULTADOL se muestra el valor positivo del resultado y si este fuera negativo se activa la bandera SIGNO (bit 0 del registro A3) para indicar que se trata de un numero negativo.

Una vez explicado el algoritmo creo que no hay necesidad de explicar la implementacion de la rutina aunque si asi fuera siempre estan los comentarios para exponer y aclarar las dudas.

Espero que esto les sirva.

Descargar codigo: Multiplicacion mediante el algoritmo de Booth

19 Comments »

RSS feed for comments on this post. TrackBack URI

  1. Estimado Sr.:

    Me es grato dirijirme a ud. para pedirle que por favor me oriente de como realizar un programa exponencial con multiplicaciones sucesivas.

  2. Buen Blog

  3. Excelente tutorial, muy buen manejo del lenguaje y muy practico.

  4. Gracias Alexi y GenioMaligno por sus comentarios.

  5. Me entero que existia este algoritmo, aqui en tu blog.

    Esta muy bueno.

  6. Gracias Cristobal, da gusto que te parezca bueno este algoritmo.

  7. Gracias por la exlicación detallada del algoritmo. Queda muy claro, lo cual me ayudará a realizar una práctica en la escuela, y estoy seguro de que varios compañeros ya deben estar viendo este documento. Muchas gracias por la aportación.

  8. Muchas gracias por dar una buena explicacion sobre este algoritmo, vi otras 4 explicaciones detalladamente y la verdad no logre entenderlas ya que utilizan numeros negativos y no son claras las explicaciones sobre como las usan.

  9. Que bueno que les parezca una explicación sencilla. En la escuela yo vi una ponencia sobre este tema pero tampoco me quedó muy claro por lo que me puse a investigar para escribir este post.

  10. Muy buena explicación y ejemplo. Muchas gracias! En la facultad vimos en tema pero no me habia quedado muy claro.
    Saludos!

  11. Esta muy bien explicado el algoritmo y muy claro. Quisiera saber como sería para la división.

  12. el complemento a dos de 6 no es 1011 sino 1010 no te parece?

  13. ale, tienes razón, parece que me falló ese complemento, ahorita mismo lo corrijo. Gracias.

  14. Pequeña corrección:

    “Se puede observar que los tres números formados son de 17 bits cuando los números que se van a multiplicar son de 8 de modo que los números formados siempre serán de N+1 bits”

    Creo que donde dice “N+1 bits” debería decir “(2 x N) + 1 bits”.

    Excelente explicación.

  15. Excelente y gracias por tu aporte, me sera de gran ayuda.

  16. Muy buena la explicación, y coincido en la correción de Ricardo, bueno, gracias, me ha ayudado bastante.

  17. A ver, ale te dijo que el complemento a dos de 6 no es 1011 sino 1010 y tenía razón… lo que te llevó a corregir el artículo, PERO el error de ale es que se ha confundido -liándote a ti también- y NO se debe calcular el complemento a dos del multiplicador si no del MULTIPLICANDO que es 5 y por eso tu inicialmente tendrías puesto 1011 que es lo correcto.

    Imagino que ya hace tiempo y no leerás esto, pero si lo lees, creo que deberías corregir el error al que ale te ha inducido.

    Un saludo.

    PD: si estoy equivocado aceptaría de buen grado que alguien me corrigiese

  18. Puede ser que la suma de P+S este mal? agradesco la explicacion pero como estaba buscando para conocerlo, este ejemplo no me sirve, sin embargo buen aporte me quedo claro el concepto.

  19. muy buena la explicacion…. que cambiios se debe realizar para efectuar la división??????


Leave a comment

XHTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <pre> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Blog at WordPress.com. | Theme: Pool by Borja Fernandez.
Entries and comments feeds.