Practico 4 ejercicio 3

Practico 4 ejercicio 3

de Amalia Lucia Balestrazzi Silveira -
Número de respuestas: 7

Buenas, 

Quería saber si pensé bien este ejercicio. Adjunto mi solución.

Gracias

ej

En respuesta a Amalia Lucia Balestrazzi Silveira

Re: Practico 4 ejercicio 3

de Gustavo Brown -
Hola,
Para la primer parte faltaría aclarar cual es el bit menos significativo de las direcciones (aunque un poco se deduce por el ordenamiento que le das a los bits).
La segunda parte no guarda en la ROM los datos requeridos.
La rutina "principal" no debe recibir ningún parámetro y debe cargar completamente el arreglo que representa la ROM (todas las direcciones desde la 0 hasta la 2047).
Para cada direccion debes decodificar los parámetros asociados (el contenido de b y el contenido de cant). Luego calcular cuál sería el contenido en la ROM para la dirección de memoria de acuerdo a esos parámetros y guardar allí el mismo.
La ROM la modelas como una arreglo global ROM de tamaño adecuado, en este sería ser un
unsigned char ROM [2048]

Saludos,
Gustavo
En respuesta a Gustavo Brown

Re: Practico 4 ejercicio 3

de Amalia Lucia Balestrazzi Silveira -
Hola Gustavo, esto lo vimos ayer en el practico contigo, pero agrego aca como me quedo por si le sirve a alguien:

char* rom;
void shiftRight() {
  for (unsigned char cant = 0; cant < 8; cant++) {
    for (unsigned char b = 0; b < 128; b++) { //positivos
      rom[cant << 8 | b] = b >> cant;
    }
    for (unsigned char b = 128; b < 256; b++) { //negativos
      for (short j = 0; j < cant; j++) {
        rom[cant << 8 | b] = (i/2) | 0x80;
      }
    }
  }
}
En respuesta a Amalia Lucia Balestrazzi Silveira

Re: Practico 4 ejercicio 3

de Gustavo Brown -
Hola,
Ese código no calcula correctamente el caso de los números negativos porque no actualiza el valor sino que lo sobreescribe, y estimo que i era b.
esta parte del código:
      for (short j = 0; j < cant; j++) {
        rom[cant << 8 | b] = (i/2) | 0x80;
      }

debería ser algo así
     unsigned char contenido=0;
      for (short j = 0; j < cant; j++) {
        contenido = contenido >> 1 | 0x80;   // ingreso los 1 por la izquierda
      }
     rom[cant << 8 | b] = (b >> cant) | contenido;   // le agrego el byte desplazado

En respuesta a Gustavo Brown

Re: Practico 4 ejercicio 3

de Paulo Elder Sánchez Cuello -
Hola, yo escribí un código que me quedo bastante diferente, pero lo probé y funciona, quería saber si tiene alguna particularidad que lo haga invalido dentro de los parámetros del curso (osea que no me lo acepten en un parcial o examen)
Saludos Paulo.

#include int main(void){

char MemoriaRom[2048];

for(int i=0; i<2048; i++){

unsigned char numero = i;
unsigned char desplazamiento = i >> 8;
unsigned char numeroEnRam = numero >> desplazamiento;
char EsNegativo = numero;

if(EsNegativo < 0){
numeroEnRam = numeroEnRam | ~(0xFF >> desplazamiento);
}
MemoriaRom[i] = numeroEnRam;

}

printf("\n %d", MemoriaRom[0] );
printf("\n %d", MemoriaRom[1] );
printf("\n %d", MemoriaRom[2] );
printf("\n %d", MemoriaRom[4] );
printf("\n %d", MemoriaRom[8] );
printf("\n %d", MemoriaRom[16] );
printf("\n %d", MemoriaRom[32] );
printf("\n %d", MemoriaRom[64] );

printf("\n %d", MemoriaRom[128 + 0] );
printf("\n %d", MemoriaRom[128 + 256] );
printf("\n %d", MemoriaRom[128 + 512] );
printf("\n %d", MemoriaRom[128 + 256 + 512] );

printf("\n %d", MemoriaRom[128 + 256 + 512 + 1024] );

printf("\n");

}
En respuesta a Paulo Elder Sánchez Cuello

Re: Practico 4 ejercicio 3

de Gustavo Brown -
Si, parece que funciona bien y hace uso ingenioso de manejo de bits.

Honestamente cuando le di la primer mirada pense que no tenía chances de andar, pero mirando con más detenimiento veo que sí hace lo que se pide... Este tipo de código en la vida real es el que hay que comentar un poco para que un tercero que lo lea pueda entender por dónde viene la cosa.

Saludos,
Gustavo
En respuesta a Gustavo Brown

Re: Practico 4 ejercicio 3

de Benjamin Montenegro Muniz -
Buenas, quería hacer una consulta sobre el manejo del tipo char en C, por lo que tengo entendido ya hace lo que pide la letra del ejercicio, es decir, al hacer shift agrega 1s si es negativo y 0s si es positivo en representación complemento a 2. Tomando en cuenta eso, el siguiente algoritmo parece funcionar:
char rom[2048];
for (short i = 0; i < 2048; i++)
{
short desplazamiento = i & 0x0007;//desplazamiento en 3 bits menos significativos
short numero = i >> 3;
char resultado = char(numero) >> desplazamiento;//casteo el número en char con signo y luego shift
rom[i] = resultado;
}
En respuesta a Benjamin Montenegro Muniz

Re: Practico 4 ejercicio 3

de Gustavo Brown -
El estándar de C en realidad dice que el shift a la derecha (>>) de un tipo integral con signo está indefinido cuando se trabaja con un número negativo.
A efectos de este curso es mejor pensarlo como que hace un shift lógico (mete 0 a la izquierda) y uno le pone los 1 a la izquierda "a fuego" con una máscara |. 
O sea, como puso un compañero en este mismo hilo:
   resultado = resultado | ~(0xFF >> desplazamiento)
El compilador en el que probaste tu código seguramente ya esté haciendo un shift aritmético a la derecha también para números negativos y por eso ves que te queda el resultado que vos querías.
 
Saludos,
  Gustavo