[pr 4][ej. 3]

[pr 4][ej. 3]

de Lucas Lusardo Silva -
Número de respuestas: 3

Se desea usar una ROM para implementar una función ROTACIÓN que tiene dos
variables de entradas: un byte destinado a ser girado en forma circular (cada bit se
corre al lugar siguiente y el ultimo al primero) y tres bits que indican el número de veces
que se desea girar. La función devuelve el byte con sus ocho bits girados una cantidad
de lugares entre 0 y 7 (según los tres bits).
a) Definir las entradas, salidas, tamaño y organización de la ROM necesaria.
b) Escribir un programa que genere el contenido de la ROM (para cada dirección
calcular su contenido). Para esto se debe emplear un lenguaje de alto nivel que
soporte la aritmética entera (de 16 bits por lo menos), las cuatro operaciones y
modulo.
Nota: no se disponen de otras operaciones sobre el tipo entero.

Agradeceria si alguien puede darme una mano en como pensarlo, ya que de la forma que lo estoy haciendo tengo la complicacion de como saber cuantas veces "girar"

En respuesta a Lucas Lusardo Silva

Re: [pr 4][ej. 3]

de Luis Cristian Veljacic Perez -

La cantidad de rotaciones te la da los 3 bits de la entrada que se destinan para eso. Una forma de resolverlo que se me ocurrió fue considerar una entrada de 11 bits, donde los 8 bits menos representativos son del entero que se quiere girar, y los 3 más representativos indican la cantidad de giros (de 0 a 7).

Si tenés la entrada NUM representada por los 11 bits, y DATO es el entero a girar y ROT la cantidad de rotaciones, entonces: 

DATO = NUM%256;  ROT = NUM/256;

y la rotación de una sola posición de DATO (es decir cuando ROT = 1) se puede implementar así:

DATO = (DATO%128)*2 + DATO/128;

Y si tenés que rotar más cantidad de veces, simplemente iterás esta fórmula de acuerdo al valor de ROT.

Espero que esa sugerencia te sirva, saludos

En respuesta a Luis Cristian Veljacic Perez

Re: [pr 4][ej. 3]

de Anthony Martin Cabrera Gonzalez -

Complemento lo que hace "DATO = (DATO%128)*2 + DATO/128":

// ej: 1000 1101

DATO = (DATO%128)*2 + DATO/128; 

(DATO%128) --> toma los 7 bits menos significativos // 0000 1101

(DATO%128) * 2 --> shiftea un lugar a la izquierda // 0001 1010

Dato/128 es un shift, Dato >> 7, por lo tanto pone el bit mas significativo original en el primer lugar. // 0000 0001

Sumando: 0001 1010 + 0000 0001 = 0001 1011