Operaciones en BCD

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

Reply to
DrAcKe
Loading thread data ...

"DrAcKe" escribió en el mensaje news: snipped-for-privacy@4ax.com...

Y los numeros de entrada como son? una cadena ascii? un binario de 8 bits? de 32 bits?

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.

Reply to
Eduardo

"RooT" escribió en el mensaje news: snipped-for-privacy@uni-berlin.de...

BCD

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.

Reply to
Eduardo

hacer

3

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

Reply to
Jorge Sánchez

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

Reply to
DrAcKe

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
jose.mgg@terra.es
http://213.97.130.124


"DrAcKe"  escribió en el mensaje
news:q2aso094uns0s590nd74hhlnaqr4fs12as@4ax.com...

> 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.
>
Reply to
Pepitof

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.

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.

AAM simplemente hace AH=AL\10 y AL=AL mod 0Ah, o sea pasa un numero binario Con lo dicho aquí me doy cuenta de que hay una cosa que no había

Repasa la materia y las relacionadas desde el comienzo.

Eduardo.

Reply to
Eduardo

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.

Reply to
Nolo Pongo

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

Reply to
DrAcKe

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 snipped-for-privacy@terra.es http://213.97.130.124

"DrAcKe" escribió en el mensaje news: snipped-for-privacy@4ax.com...

Reply to
Pepitof

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,

formatting link
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

Reply to
DrAcKe

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.

Reply to
Nolo Pongo

Un genio el Tuning ese, si con semajante máquina llego a hacer algo, que sospecho que va a ser que si -)

Reply to
Nolo Pongo

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.