Come detto, esiste un altro tipo di dato aggregato, molto utile per la gestione a basso livello della memoria, il bitfield. L' impiego di campi di bit si rende necessario quando si voglia accedere ai singoli bit. In generale, un bitfield è definito in maniera analoga a quanto segue:
struct nome_struttura{
type nome_var1 : dimensione1;
type nome_var2 : dimensione2;
type nome_var3 : dimensione3;
}
struct_nomestruttura mia_var;
Dove type realizza il tipo del campo di bit:
Si possono avere:
int, unsigned, signedOvviamente, ove si necessiti di un singolo bit, si scriverà
unsigned.Inoltre, la dimensione indicata deve corrispondere al numero di bit singoli che il campo comprende.
L'accesso e le istruzioni di assegnazione di un valore ai membri di una variabile di tale tipo, avvengono in maniera esattamente analoga alle comuni strutture.
es.:
struct byte_acchiappato_dalla_seriale{
unsigned primo: 1;
unsigned secondo: 1;
unsigned terzo: 1;
unsigned quarto: 1;
unsigned quinto: 1;
unsigned sesto: 1;
unsigned settimo: 1;
unsigned ultimo: 1;
}arrivato;
Volendo interpretare i bit della struttura sopra come valori boleani, si potrebbe voler fare un controllo del tipo:
if (arrivato.primo) printf("\t Ma chi te lo ha fatto fare\n");
Ovvero, voler fare un semplice assegnamento del tipo:
arrivato.primo = 0;
arrivato.ultimo = 1;
Se qualcuno volesse sapere quale sia il piazzamento ottenuto, basterebbe verificare quale sia il bit settato ad uno (ovvero: qule campo restituisce il valore VERO).
In maniera abbastanza palese, l'esempio sopra non è economico come sembra a prima vista, tuttavia serve a mostrarere l'impiego pratico dei campi di bit. L'utilità vera è nella possibilità di impiegare, ove sia possibile, il quanto minimo di informazione, laddove un intero byte rappresenterebbe uno spreco inutile di risorse cruciali. Il caso tipico è rappresentato dalla scrittura di un kernel, dove è inoltre necessario controllare i singoli registri della CPU. Il C non sarebbe il linguaggio potente e versatile che di fatto è, se non avesse questa importante caratteristica, che permette di evitare l'impiego del linguaggio assembly laddove con altri linguaggi non sarebbe possibile.