27 enero 2006

Variables de menos de un byte en C

En C es posible crear una estructura cuyos campos tengan menos de 1 byte de tamaño. Esto es útil, por ejemplo, si queremos muchos booleanos.

Cuando tenemos booleanos, lo normal es hacer un entero de valor 0 o 1. Si somos listos, quizás pongamos un char que ocupa menos.

Con algo como esto, podemos hacer una estructura con muchos booleanos dentro de un solo bit. La siguiente estructura, por ejemplo, contiene 5 booleanos de 1 bit.

struct Booleanos
{
unsigned int b1:1;
unsigned int b2:1;
unsigned int b3:1;
unsigned int b4:1;
unsigned int b5:1;
}


Posiblemente el compilador haga que la estructura completa ocupe uno o varios bytes completos (según la cantidad de campos que metamos dentro), pero hemos conseguido un ahorro importante de espacio de memoria.

Tambien es posible hacer campos de dos bits, de tres, etc.

struct VariableRaras
{
unsigned int a:3; /* 3 bits */
unsigned int b:4; /* 4 bits */
}


En estos campos sólo caben número pequeños. Por ejemplo, en a sólo podemos meter números de 0 (000 en binario) a 7 (111 en binario). Si nos pasamos de rango, estaremos machacando el campo anterior o el siguiente (depende del micro que usemos).

En fin, esto es útil para ahorrar espacio de memoria o incluso cuando trabajamos a nivel de bits, para acceder más fácilemte a bits o grupos de bits dentro de una zona de memoria.

En http://www.zator.com/Cpp/E4_6.htm hay un tutorial más completo sobre esto

1 comentario:

Sergio dijo...

Interesante este post. No sabia que se podia hacer eso de una manera tan sencilla. Siempre habia usado defines con 0x01 y todas esas cosas para controlar los bits. Voy a probar cosillas con esto. Un saludo y gracias por tu blog!