Función "leer" de tarea0

Función "leer" de tarea0

de Alexis Baladon Ferreira De Araujo -
Número de respuestas: 1

Buenas! Quería consultar sobre esta función:

Leer(unsigned *x, unsigned k): Lee k bits del archivo y los coloca en los k bits menos significativos de x. Los restantes bits de x son puestos en cero.

No me queda claro qué bits deberían ser leídos, adjunto imagen de lo que interpreté del problema:


En el caso de k = 3, supongo que estos deberían reemplazar a los bits b2,b1,b0 de x, pero no me doy cuenta de qué 3 bits de la tira leída debería elegir. ¿Se supone que debería pensarlo a partir del bit 32 (suponiendo que numArchivo es de tipo unsigned int), desde el primer bit igual a 1, o los 3 menos significativos?

Espero haber sido claro, gracias!  

En respuesta a Alexis Baladon Ferreira De Araujo

Re: Función "leer" de tarea0

de Alvaro Martin -

Hola.

Pensemos el contenido del archivo como si fuera una secuencia de símbolos binarios, llamémosle z, que por algún capricho de la arquitectura solo podemos acceder en bloques de a 8. El primer byte del archivo contiene los primeros 8 símbolos de z, el segundo byte contiene los siguientes 8 símbolos de z, y así sucesivamente. En vez de octetos podemos pensar en bloques de otro tamaño; en tu ejemplo es 32 (pero ojo que int no tiene por qué ser de 32 bits).

Ahora, supongamos que leemos el primer byte del archivo, llamémosle b. ¿El primer símbolo de z está representado por b_0 o por b_7? En realidad depende de cómo lo quieran interpretar ustedes; no hay nada que lo defina a priori. La misma pregunta podría caber para la semántica de lo que devuelve la función. ¿En qué orden deben interpretarse los k bits menos significativos devueltos en x? ¿se lee desde b_{k-1} hacia b_0 o al revés?

Lo importante es tomar un criterio y ser consistente a lo largo de todas las funciones que escriban. A mí me resulta más natural pensar la secuencia como ordenada desde los bits más significativos a los menos significativos. Por ejemplo, si los primeros 2 bytes del archivo son b y c, en ese orden, y se ejecutan tres llamadas a la función Leer, para k= 5, después k=3, y después k=4, el resultado sería:

Leer (&x, 7) carga b_7 ... b_1 en x_6 ... x_0 y se pone x_7 en 0
Leer (&x, 3) carga b_0 en x_2, y  c_7... c_6 en x_1 ... x_0, y  se pone x_7..x_3 en 0
Leer (&x, 4) carga c_5 ... c_2 en x_3 ... x_0 y se pone x_7..x_4 en 0

Saludos,
Álvaro