Discussion:
Operaciones en BCD
(demasiado antiguo para responder)
DrAcKe
2004-11-06 13:17:11 UTC
Permalink
Hola,

Lo primero, es aclarar que no estoy muy seguro de dónde preguntar
esto, pero a ver si alguien puede dar algo de luz al asunto. El
problema que me encuentro es que tengo que hacer una práctica (es de
Informática) y uno de los problemas de fondo es que tengo que
convertir los números de entrada a BCD (no lo pone, pero he decidido
hacerlo), y el problema es el siguiente, para sumar dos números
representados en BCD, me explico por cada cifra se ponen 4 bits,
ejemplo 12 = 0001 0010 he encontrado un método que es similar al sumar
en binario ajustando el resultado. El problema es que necesito
multiplicar y no he conseguido saber como se multiplica.

También había pensado en que quizá exista algún integrado que
multiplique en BCD, pero no se modelos y tampoco se por donde buscar.
(En San Google, no termino de encontrar lo que quiero) Quizá algún
datasheet me diga como esta implementado.

Bueno, gracias por leer todo este mensaje, y cualquier sugerencia u
orentación será bienvenida.

Thanks

By3z, DrAcKe
RooT
2004-11-06 14:53:45 UTC
Permalink
Consejo:

Eso no se hace asi, sino tienes integrados especificos para bcd se trabaja en
binario y luego los conviertes, que convertir de binario a BCD de cualquier peso
es sencillisimo.

Te lo dice tambien uno que tubo un problema de examen parecido.
--
"Puta huevon. En mi país los que se fueron al otro mundo cuando estaba en el
poder mi Excelente e impoluto General Pinochet, se fueron por huevones
jilipollas." by Juvenal

Saludos.
Post by DrAcKe
Hola,
Lo primero, es aclarar que no estoy muy seguro de dónde preguntar
esto, pero a ver si alguien puede dar algo de luz al asunto. El
problema que me encuentro es que tengo que hacer una práctica (es de
Informática) y uno de los problemas de fondo es que tengo que
convertir los números de entrada a BCD (no lo pone, pero he decidido
hacerlo), y el problema es el siguiente, para sumar dos números
representados en BCD, me explico por cada cifra se ponen 4 bits,
ejemplo 12 = 0001 0010 he encontrado un método que es similar al sumar
en binario ajustando el resultado. El problema es que necesito
multiplicar y no he conseguido saber como se multiplica.
También había pensado en que quizá exista algún integrado que
multiplique en BCD, pero no se modelos y tampoco se por donde buscar.
(En San Google, no termino de encontrar lo que quiero) Quizá algún
datasheet me diga como esta implementado.
Eduardo
2004-11-06 15:06:51 UTC
Permalink
Post by DrAcKe
Hola,
Lo primero, es aclarar que no estoy muy seguro de dónde preguntar
esto, pero a ver si alguien puede dar algo de luz al asunto. El
problema que me encuentro es que tengo que hacer una práctica (es de
Informática) y uno de los problemas de fondo es que tengo que
convertir los números de entrada a BCD (no lo pone, pero he decidido
hacerlo)
Y los numeros de entrada como son? una cadena ascii? un binario de 8 bits?
de 32 bits?
Post by DrAcKe
, y el problema es el siguiente, para sumar dos números
representados en BCD, me explico por cada cifra se ponen 4 bits,
ejemplo 12 = 0001 0010 he encontrado un método que es similar al sumar
en binario ajustando el resultado. El problema es que necesito
multiplicar y no he conseguido saber como se multiplica.
Creo que te estas enredando o no sabes explicarte.

Hay un algoritmo bastante practico de conversion de binario a BCD sin hacer
multiplicaciones, solo sumar y desplazar, yo lo conozco como "el de sumar 3
y correr", no tengo ningun ejemplo como para 'cortar y pegar' y ahora no
tengo tiempo de escribirte uno.

Eduardo.
Post by DrAcKe
También había pensado en que quizá exista algún integrado que
multiplique en BCD, pero no se modelos y tampoco se por donde buscar.
(En San Google, no termino de encontrar lo que quiero) Quizá algún
datasheet me diga como esta implementado.
Bueno, gracias por leer todo este mensaje, y cualquier sugerencia u
orentación será bienvenida.
Thanks
By3z, DrAcKe
RooT
2004-11-06 15:05:02 UTC
Permalink
Lo que creo es que quiero operar directamente con BCD, osease multiplicar BCD
tal cual.. no binario y luego convertir...
--
"Puta huevon. En mi país los que se fueron al otro mundo cuando estaba en el
poder mi Excelente e impoluto General Pinochet, se fueron por huevones
jilipollas." by Juvenal

Saludos.
Eduardo
2004-11-06 15:26:35 UTC
Permalink
Post by RooT
Lo que creo es que quiero operar directamente con BCD, osease multiplicar BCD
tal cual.. no binario y luego convertir...
Al principio habla de 'convertir los números de entrada a BCD ', puede
tratarse de dislexia porque despues quiere hacer operaciones todas en BCD,
tambien puede ser un juego donde hay que adivinar el enunciado porque
tampoco dice con cuantos digitos tiene que operar.

Eduardo.
Jorge Sánchez
2004-11-06 19:54:12 UTC
Permalink
Post by Eduardo
Post by DrAcKe
, y el problema es el siguiente, para sumar dos números
representados en BCD, me explico por cada cifra se ponen 4 bits,
ejemplo 12 = 0001 0010 he encontrado un método que es similar al sumar
en binario ajustando el resultado. El problema es que necesito
multiplicar y no he conseguido saber como se multiplica.
Creo que te estas enredando o no sabes explicarte.
Hay un algoritmo bastante practico de conversion de binario a BCD sin hacer
multiplicaciones, solo sumar y desplazar, yo lo conozco como "el de sumar 3
y correr", no tengo ningun ejemplo como para 'cortar y pegar' y ahora no
tengo tiempo de escribirte uno.
Solo puntualizar un detalle: en realidad la operación de multiplicar en
binario, no es más que sumar y desplazar a la izquierda. El sumar 3 y
desplazar, equivale a sumar tres y multiplicar por dos, tantas veces como
posiciónes se desplace la palabra binaria.

Saludos
Jorge
DrAcKe
2004-11-07 14:08:12 UTC
Permalink
Hola,

Bueno, lo primero gracias a todos los que han contestado el mensaje,
a continuación expongo un poco mejor el problema.

El problema consiste en hacer una máquina de Turing que calcule el
determinante de una matriz nxn por el método de los cofactores. Hasta
aquí puede ser un problema más o menos fácil de programación, pero
como hay que hacerlo en una máquina de Turing hay problemas. Primero
una máquina de Turing, dados mis pocos conocimientos en electrónica la
única cosa con la que lo puedo asemejar es con un autómata de estos
que se hacen con biestables.

A lo que vamos, la máquina no sabe ni sumar, ni multiplicar, ni nada,
sólo esta en un estado lee una entrada, pasa a otro estado y escribe
una salida. La cadena de entrada de la máquina tiene los números en
decimal tipo 10,34.. y por limitaciones del simulador usado nos vemos
en la obligación de tener que convertir estos números a una
codificación en binario o similar y hemos elegido BCD, porque la
conversion la hacemos a través de una tabla tipo 1 pon 0001 y así, ya
que no podemos convertir a binario porque no sabemos dividir entre
dos.

De ahí viene el problema de que tengo números en pseudo-binario o
como pueda denominarse y claro tengo que operar con ellos, por esto
estaba buscando a ver si alguien sabía multiplicar en BCD. En binario
se multiplicar y el algoritmo es sencillo, pero en BCD no he
conseguido nada.

Señalar que los números pueden ser de longitud n, por lo que la
codificación en unario se descartó por la lentitud de por ejemplo
convertir 300000.

Buscando por ahí, encontré que las instrucciones AAM por ejemplo que
son del micro 8086 se supone que hacen algo parecido, pero tienen dos
problemas, primero necesitan mucho espacio y luego que el
comportamiento no es seguro en las conversiones.

Con lo dicho aquí me doy cuenta de que hay una cosa que no había
pensado, puesto que se multiplicar en binario, voy a ver si san Google
me dice como pasar de bcd a binario a ver si es viable.

Gracias por leer este pedazo de mensaje, cualquier sugerencia o idea
será bienvenida.

By3z, DrAcKe
Pepitof
2004-11-07 17:05:27 UTC
Permalink
Esto no lo entiendo. Cuando dices "no sabemos dividir por 2", ¿te refieres a
que es una imposición del problema?
En cualquier caso, se puede convertir de decimal a binario sin usar la
división, sino sólo la resta y la comparación, si dispones de una tabla de
las potencias de dos desde 0 hasta el ancho de palabra máximo. Además, esa
misma tabla la necesitarás si al final quieres convertir el resultado de
binario a decimal o tra vez.
El método es simple, comparas el número con la mayor potencia de dos que
permita el sistema. Si el decimal es menor, pones un 0. Si el decimal es
mayor o igual, pones un 1 y le restas esa misma potencia de dos al decimal.
Y así con todas las potencias de 2 hasta llegar a 0.
--
Saludos de Jose Manuel Garcia
***@terra.es
http://213.97.130.124
Post by DrAcKe
conversion la hacemos a través de una tabla tipo 1 pon 0001 y así, ya
que no podemos convertir a binario porque no sabemos dividir entre
dos.
Eduardo
2004-11-07 20:07:09 UTC
Permalink
Post by DrAcKe
Hola,
Bueno, lo primero gracias a todos los que han contestado el mensaje,
a continuación expongo un poco mejor el problema.
El problema consiste en hacer una máquina de Turing que calcule el
determinante de una matriz nxn por el método de los cofactores. Hasta
aquí puede ser un problema más o menos fácil de programación, pero
como hay que hacerlo en una máquina de Turing hay problemas. Primero
una máquina de Turing, dados mis pocos conocimientos en electrónica la
única cosa con la que lo puedo asemejar es con un autómata de estos
que se hacen con biestables.
A lo que vamos, la máquina no sabe ni sumar, ni multiplicar, ni nada,
sólo esta en un estado lee una entrada, pasa a otro estado y escribe
una salida. La cadena de entrada de la máquina tiene los números en
decimal tipo 10,34.. y por limitaciones del simulador usado nos vemos
en la obligación de tener que convertir estos números a una
codificación en binario o similar y hemos elegido BCD, porque la
conversion la hacemos a través de una tabla tipo 1 pon 0001 y así, ya
que no podemos convertir a binario porque no sabemos dividir entre
dos.
De ahí viene el problema de que tengo números en pseudo-binario o
como pueda denominarse y claro tengo que operar con ellos, por esto
estaba buscando a ver si alguien sabía multiplicar en BCD. En binario
se multiplicar y el algoritmo es sencillo, pero en BCD no he
conseguido nada.
De BCD a binario es elemental, si el numero es por ejemplo 5421 ,si lo
tienes en BCD empaquetado lo pasas a un digito por byte
, quedara B3=5, B2=4, B1=2, y B0=1 , luego haces una rutina que haga la
operacion binaria Q=Q*0Ah+P y la llamas tres veces.
Q= B3
Q= Q*0Ah + B2
Q= Q*0Ah + B1
Q= Q*0Ah + B0

El problema es en realidad todo lo otro, las rutinas de multiplicacion y
adicion con una maquina de Turing.
Post by DrAcKe
Señalar que los números pueden ser de longitud n, por lo que la
codificación en unario se descartó por la lentitud de por ejemplo
convertir 300000.
Me parece que no tienes la menor idea de lo que es representar un numero en
BCD, binario o hexadecimal y la manera que se almacenan en memoria.
Post by DrAcKe
Buscando por ahí, encontré que las instrucciones AAM por ejemplo que
son del micro 8086 se supone que hacen algo parecido, pero tienen dos
problemas, primero necesitan mucho espacio y luego que el
comportamiento no es seguro en las conversiones.
AAM simplemente hace AH=AL\10 y AL=AL mod 0Ah, o sea pasa un numero binario
<100 a BCD
Post by DrAcKe
Con lo dicho aquí me doy cuenta de que hay una cosa que no había
pensado, puesto que se multiplicar en binario, voy a ver si san Google
me dice como pasar de bcd a binario a ver si es viable.
Gracias por leer este pedazo de mensaje, cualquier sugerencia o idea
será bienvenida.
Repasa la materia y las relacionadas desde el comienzo.

Eduardo.
Post by DrAcKe
By3z, DrAcKe
Nolo Pongo
2004-11-09 18:48:16 UTC
Permalink
Post by DrAcKe
De ahí viene el problema de que tengo números en pseudo-binario o
como pueda denominarse y claro tengo que operar con ellos, por esto
estaba buscando a ver si alguien sabía multiplicar en BCD. En binario
se multiplicar y el algoritmo es sencillo, pero en BCD no he
conseguido nada.
MUltiplicar en BCD es elemental siempre que multipliques
dígito a digito, solo tienes que tener la tabla de multiplicar
de 10x10 (la mitad en realidad) y hacerlo exactamente igual
que cuando lo haces a mano (sin calculadora !)

El problema para multiplicar es si tienes dos digitos
BCD en el mismo byte, pero si imaginas un digito bcd en cada byte
verás que es mucho mas facil.

Si te quieres ahorrar la tabla, te preparas una funcion
que multiplique en binario numeros de 4 bits, y pase el resultado
a BCD.
DrAcKe
2004-11-09 19:00:30 UTC
Permalink
Hola,

Bueno, lo primero agradecer a todos los que han leido o contestado
este post.

Al final, la solución que usaré es la de convertir los dígitos
decimales a BCD y luego pasar esto a binario. De esta forma las
máquinas de sumar y multiplicar son mucho más fáciles.
Lo de multiplicar en bcd al final lo he desechado porque se me hacia
mucho más dificil adaptar la multiplicación que hacer una conversión
anterior, y si cabe me llevaba más tiempo. El método para convertir a
BCD por si alguien lo necesita es el mismo que dice Eduardo, que
básicamente es multiplicar por 10 y luego sumar el siguiente.

Pues, nada muchas gracias

By3z, DrAcKe
Pepitof
2004-11-09 19:58:24 UTC
Permalink
No entiendo nada. Es mucho más fácil convertir directamente de decimal a
binario que de decimal a BCD y luego de BCD a binario, creo yo. No comprendo
esa manía de meter por medio el BCD.
--
Saludos de Jose Manuel Garcia
***@terra.es
http://213.97.130.124
Post by DrAcKe
Hola,
Bueno, lo primero agradecer a todos los que han leido o contestado
este post.
Al final, la solución que usaré es la de convertir los dígitos
decimales a BCD y luego pasar esto a binario. De esta forma las
máquinas de sumar y multiplicar son mucho más fáciles.
Lo de multiplicar en bcd al final lo he desechado porque se me hacia
mucho más dificil adaptar la multiplicación que hacer una conversión
anterior, y si cabe me llevaba más tiempo. El método para convertir a
BCD por si alguien lo necesita es el mismo que dice Eduardo, que
básicamente es multiplicar por 10 y luego sumar el siguiente.
Pues, nada muchas gracias
By3z, DrAcKe
DrAcKe
2004-11-10 21:36:20 UTC
Permalink
Intentaré explicar mejor la problemática. Quizá al referirme al
término máquina, pueda dar a confusión. La máquina de Turing es un
modelo teórico, por el cuál se puede resolver algún problema que tenga
un algoritmo que lo resuelva. A la hora de hacer las prácticas, el
problema principal es que para convertir de decimal a binario un
número cualquiera, por ejemplo, puedo utilizar el método de la
división entre dos. Pero al ir a implementar ese algoritmo ya parto de
la idea de que "se" dividir. Por ejemplo, si quiero hacer un programa
en emsamblador y quiero sumar, hay una instrucción que hace eso, pero
la problemática de esta práctica es que también tienes que diseñar que
hace esa instrucción que simplemente usas en un programa común.
Entonces claro, la complejidad de implementar ese proceso es mucho
mayor que escribir cada dígito decimal en BCD y luego operar con eso.

Si se quiere ver de un modo más gráfico o ver como se mueve hay
multitud de simuladores por ahí. Por ejemplo,
http://www.cheransoft.com/vturing/download.html
Que además se ve en una ventana.

Pero vamos resumiendo, en una máquina de Turing lo único que puedo
hacer es: Estando en un estado i y leyendo un símbolo (sólo un dígito)
paso a un estado j, escribo otro símbolo donde estaba ese y me
desplazo una posición a la izquierda o la derecha. La máquina de
Turing es solo una cinta y un ente que te almacena una tabla de
transiciones.

Espero haber dado algo lucidez al tema, pero gracias por el interés.

By3z, DrAcKe
Nolo Pongo
2004-11-11 12:29:16 UTC
Permalink
Post by DrAcKe
Espero haber dado algo lucidez al tema, pero gracias por el interés.
Un genio el Tuning ese, si con semajante máquina llego a hacer
algo, que sospecho que va a ser que si -)

Nolo Pongo
2004-11-11 12:29:15 UTC
Permalink
Post by Pepitof
No entiendo nada. Es mucho más fácil convertir directamente de decimal a
binario que de decimal a BCD y luego de BCD a binario, creo yo. No comprendo
esa manía de meter por medio el BCD.
Seguramente es un problema semantico :-)

Si por BCD entiendes un byte con dos dígitos BCD (como es normal), es
una complicacion inecesaria.

Pero si le llamas BCD a un byte con un solo digito BCD, entonces
es un paso necesario (y simple) para pasar de asci a binario.

De asci a bcd pasarías con un AND 15 y luego a binario creo que
lo mas facil es tener un registro inicializado a cero y para cada digito BCD
multiplicas el registro por 10 y le sumas el digito bcd. Simepre que los
digitos asci los estes leyendo de izquierda a derecha.
Continúe leyendo en narkive:
Loading...