Mapas de bits

Se você precisar criar um mapa de bits provavelmente pensou em fazer algo assim:

struct bitmap_t
{
  int x : 1;
  int y : 1;
  int z : 1;
  int w : 1;
};

Pode até ser que isso funcione pra você, mas as especificações de C e C++ não dizem como esse padrão de bits será montado na memória:

Essas são apenas 2 possibilidades do que seu compilador pode gerar...

Eu esperaria que o compilador gerasse o mapa de bits da primeira maneira, mas a segunda também pode acontecer. Minha dica pra você?! Não use o especificador de bits em estruturas ou uniões. No caso acima eu faria algo assim:

#define X_BIT 0x01
#define Y_BIT 0x02
#define Z_BIT 0x04
#define W_BIT 0x08

typedef int bitmap_t;

bitmap_t setbit(bitmap_t v, int bit)
{
  return (v | bit);
} 

bitmap_t resetbit(bitmap_t v, int bit)
{
  return (v & ~bit);
} 

int isbitset(bitmap_t v, int bit)
{
  return ((v & bit) != 0);
}

Onde ‘bit’ tem que ser substituido por uma das constantes ?_BIT.

Anúncios

Deixe um comentário

Faça o login usando um destes métodos para comentar:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s