[C con Clase] Campos de bits

Steven Davidson steven en conclase.net
Jue Feb 22 09:12:33 CET 2007


Hola Yudenis,

El pasado 2007-02-22 07:36:17, ymabreu escribió:

y> Hola.
y> Deja ver si entendí. No importa que el tipo sea char o int lo que importa es que lo que le boy a meter dentro tenga tantos bits como bits(valga la redundancia) tenga el "lugar" donde los boy a meter?

Exacto. El tipo que pongamos realmente indica la "aproximación" de la cantidad total de bits que queremos. Obviamente si la cantidad total es mayor al tipo que escribimos; o sea, no sabe, entonces hará falta crear más espacio del mismo tipo. Te pongo otro ejemplo,

struct info
{
  unsigned short a : 14;
  unsigned short b : 6;
  unsigned short c : 7;
  unsigned short d : 3;
  unsigned short e : 1;
};

Esta estructura ocupará 6 bytes, suponiendo que 'short int' ocupa 2 bytes (16 bits). Metemos 'a' en el primer 'unsigned short'. Luego tenemos que meter 6 bits. Como 'b' no cabe en el primer "grupo", entonces se crea otro 'unsigned short', quedando 10 bits libres. Fácilmente podemos meter a 'c', ya que ocupa 7 bits, restando 3 bits. Nuevamente, no tenemos problemas al meter a 'd' ya que sólo necesita 3 bits, quedando el segundo bloque de 'unsigned short' completo. El problema es que nos queda 'e' que ocupa solamente 1 bit, pero hay que agregar otro bloque de 16 bits, para guardar el único bit que nos queda. Al final, necesitamos 3 'unsigned short', a 16 bits cada uno, tenemos 48 bytes.

Si reorganizáramos los campos, podríamos optimizar la cantidad de memoria y nos desperdiciaríamos 2 bytes para guardar 1 solo bit. Esto sería,

struct info
{
  unsigned short a : 14;
  unsigned short e : 1;
  unsigned short b : 6;
  unsigned short c : 7;
  unsigned short d : 3;
};

Ahora, 'a' y 'e' se empaquetan en el primer 'unsigned short', quedando 1 bit sin usar, y luego, 'b', 'c', y 'd' ocupan completamente el segundo bloque. Esta nueva versión de la estructura ocupará 4 bytes = 32 bits.

y> Nuevamente muchas gracias, la verdad no esperaba una respuesta a esta hora. Creo que es de reconocer la labor que hacen en esta lista que sin dudas es un gran logro.

De nada. A veces estoy a estas horas y a veces no; me pillaste por aquí. :D


Espero que lo anterior te sea de ayuda.

Steven


Más información sobre la lista de distribución Cconclase