Buenas! Quería comentar que al revisar la tarea me sentí un poco perdido con respecto a cómo hacer las cosas que se pedían. Como en la clase de zoom se dijo que eran problemas básicos de programación quería preguntar si es normal que me encuentre así por estar recién comenzando el curso o si se supone que debería haberme inscripto sabiendo más sobre programación (hice p3 el semestre pasado). Muchas gracias!
En respuesta a Alexis Baladon Ferreira De Araujo
Re: Conocimientos de programación
de Alvaro Martin -
Hola.
Como hablamos en la clase, vamos a necesitar manejar la representación interna de tipos de datos enteros. Eso es algo que se estudia en Arquitectura de forma más amplia, pero lo necesario puntualmente para la tarea pienso que se puede aprender sin demasiado esfuerzo.
En particular, C, el tipo de datos unsigned char representa un entero en el rango 0 .... 2^8 -1.
La representación binaria de estos números usa 8 bits:
El 0 se representa con el octeto 00000000
El 1 se representa con el octeto 00000001
El 2 se representa con el octeto 00000010
El 3 se representa con el octeto 00000011
...
El 255 se representa con el octeto 11111111
En general, un octeto
representa al número
.
A b0 se le llama bit menos significativo y a b7 el bit más significativo.
Para acceder o modificar los bits que componen la representación de un número se usan operadores que provee cada lenguaje.
Supongamos que x es de tipo unsigned char.
Para hacer que el bit b_i de x valga 1, hacemos un OR (operador |) con el número 2^i. Por ejemplo, x = x | 8 hace que b_3 valga 1
Para hacer que el bit b_i de x valga 0, hacemos un AND (operador &) con el número 255 - 2^i, cuya representación binaria tiene todos los bits en 1, salvo el i-ésimo que está en 0. Por ejemplo, x = x & 247 hace que b_3 valga 0
Para consultar si el bit b_i vale 1, hacemos un AND (operador &) con el número 2^i y evaluamos si el resultado es distinto de 0.
Los operadores << y >> sirven para desplazar hacia la izquierda o la derecha la secuencia de bits que representa a un número.
x << i, desplaza i posiciones a la izquierda
x >> i, desplaza i posiciones a la derecha
Aritméticamente, el efecto que tienen es el de multiplicar o dividir a x por 2^i, respectivamente.
No usen pow, que es una función para operar con números en puntos flotante. Para obtener un potencia de 2 pueden simplemente hacer 1 << i
Si en vez de unsigned char usan algún otro tipo de datos, como unsigned int, todo es igual salvo que en vez de 8 la representación usa más bits, por ejemplo 32.
El operador sizeof() devuelve la cantidad de bytes que usa la representación interna de un tipo de datos. Si multiplican por 8 obtienen la cantidad de bits.
Un truco que les puede ser útil es que si al cero le restan 1, obtienen un número cuya representación tiene todos los bits en 1. Por ejemplo, si x es un unsigned char que vale 0, al hacer x = x - 1 obtienen el número 255, que se representa como 11111111.
Cualquier duda me preguntan.
Saludos,
Álvaro
Como hablamos en la clase, vamos a necesitar manejar la representación interna de tipos de datos enteros. Eso es algo que se estudia en Arquitectura de forma más amplia, pero lo necesario puntualmente para la tarea pienso que se puede aprender sin demasiado esfuerzo.
En particular, C, el tipo de datos unsigned char representa un entero en el rango 0 .... 2^8 -1.
La representación binaria de estos números usa 8 bits:
El 0 se representa con el octeto 00000000
El 1 se representa con el octeto 00000001
El 2 se representa con el octeto 00000010
El 3 se representa con el octeto 00000011
...
El 255 se representa con el octeto 11111111
En general, un octeto
![b_7,b_6,\,\ldots\,, b_0 b_7,b_6,\,\ldots\,, b_0](https://eva.fing.edu.uy/filter/tex/pix.php/d59066899bb967e7efe9789a265dc172.png)
![\sum_{i=0}^7 b_i2^i \sum_{i=0}^7 b_i2^i](https://eva.fing.edu.uy/filter/tex/pix.php/0295ecfb015138c32a3afcf723c6b298.png)
A b0 se le llama bit menos significativo y a b7 el bit más significativo.
Para acceder o modificar los bits que componen la representación de un número se usan operadores que provee cada lenguaje.
Supongamos que x es de tipo unsigned char.
Para hacer que el bit b_i de x valga 1, hacemos un OR (operador |) con el número 2^i. Por ejemplo, x = x | 8 hace que b_3 valga 1
Para hacer que el bit b_i de x valga 0, hacemos un AND (operador &) con el número 255 - 2^i, cuya representación binaria tiene todos los bits en 1, salvo el i-ésimo que está en 0. Por ejemplo, x = x & 247 hace que b_3 valga 0
Para consultar si el bit b_i vale 1, hacemos un AND (operador &) con el número 2^i y evaluamos si el resultado es distinto de 0.
Los operadores << y >> sirven para desplazar hacia la izquierda o la derecha la secuencia de bits que representa a un número.
x << i, desplaza i posiciones a la izquierda
x >> i, desplaza i posiciones a la derecha
Aritméticamente, el efecto que tienen es el de multiplicar o dividir a x por 2^i, respectivamente.
No usen pow, que es una función para operar con números en puntos flotante. Para obtener un potencia de 2 pueden simplemente hacer 1 << i
Si en vez de unsigned char usan algún otro tipo de datos, como unsigned int, todo es igual salvo que en vez de 8 la representación usa más bits, por ejemplo 32.
El operador sizeof() devuelve la cantidad de bytes que usa la representación interna de un tipo de datos. Si multiplican por 8 obtienen la cantidad de bits.
Un truco que les puede ser útil es que si al cero le restan 1, obtienen un número cuya representación tiene todos los bits en 1. Por ejemplo, si x es un unsigned char que vale 0, al hacer x = x - 1 obtienen el número 255, que se representa como 11111111.
Cualquier duda me preguntan.
Saludos,
Álvaro
En respuesta a Alvaro Martin
Re: Conocimientos de programación
Gracias por la respuesta! Me sirvió un montón todo lo que escribiste