Domanda

Mi piacerebbe avere un dentro matrice di una struct po 'ricco. So staticamente la dimensione della matrice (32), e vorrei ogni elemento dell'array per essere un singolo bit. Ad esempio, mi piacerebbe essere in grado di dire qualcosa del tipo:

struct example_s {
  // ...
  unsigned int flags[32] : 32;
} __attribute__((__packed__));

Ho provato un paio di cose, ma gcc non si muove. Sarebbe bello per essere in grado di fare questo modo che io possa scrivere codice pulito che iterata sugli elementi dell'array al sacco. Idee?

È stato utile?

Soluzione

Se si porta in un (a 32 bit) Int, allora è possibile in modo pulito iterare sulle punte con un ciclo come questo:

for (bit = 0; bit < 32; bit++)
    flagValue = ((flags & (1<<bit)) != 0;

Non molto più difficile da scrittura di una sintassi matrice indicizzazione.

Se si desidera nascondere il bit-girarsi per rendere il codice più leggibile si potrebbe anche utilizzare una funzione o una macro per accedere ai bit - per esempio GetFlag(bit)

Altri suggerimenti

elementi di membro

campo di bit non hanno indirizzi, quindi, anche se si potrebbe dichiarare un array di loro, non ci sarebbe modo di usarla (tutto l'accesso matrice in C è l'aritmetica dei puntatori e dereferenziazione). E 'facile il proprio codice matrice di bit utilizzando i bit di un tipo più grande però; Jason ha spiegato le basi. In generale si dovrebbe evitare l'uso di campi di bit se non si ha una buona ragione. Sono di solito più problemi di quanto valgano.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top