I campi bit, sebbene soggetti ad alcune restrinzioni (elencate più avanti), non sono altro che dei normali campi (o membri) di una struttura, con la differenza che viene specificata la lunghezza in bit del campo. Di conseguenza si può lavorare sui singoli bit di un byte. Questo metodo può offrire diversi vantaggi, a seconda di come lo si usa. Lo si può preferire ad altri per la sua facilità e chiarezza, ma tutto dipende da cosa volete fare. Un caso particolare che utilizza i campi bit è impiegare i suddetti come variabili booleane, così da ottenere 8 variabili booleane in un singolo byte. Non credo che capiterà mai a qualcuno di dover lesinare su così pochi byte, ma è comunque un'operazione fattibile. Userò questa pratica negli esempi seguenti, poichè è la più facile.

I campi bit, come detto prima, sono membri particolari delle strutture ed in esse vanno definiti. Questo è il prototipo:

 

struct nome_struttura {
tipo nome_campo_1 : lunghezza_campo;
tipo nome_campo_2 : lunghezza_campo;
/*...
  ...*/
tipo nome_campo_n : lunghezza_campo;
};
Qui nome_struttura e nome_campo sono gli identificatori con cui varrà richiamata la struttura e i suoi membri (presumo che sappiate come funziona una struttura in C). La lunghezza_campo è appunto la dimensione in bit che tale campo avrà. Il tipo di ogni singolo membro è libero, ma poichè una struttura alloca automaticamente lo spazio necessario a contenere tutti i suoi membri, se dichiarerete un campo bit come un double, molto probabilmente il compilatore fara in modo di allocare uno spazio di memoria che possa contenere un valore double, anche se verrà utilizzato solo un bit (o quelli precisati al posto di lunghezza_campo). Potete verificarlo voi stessi, facendo qualche prova con sizeof().
Ecco un esempio di come potrebbero essere dichiarati dei campi bit:
struct struttura_campi {
char bit1 : 1;
char bit2 : 1;
char bit3 : 1;
char bit4 : 1;
char bit5 : 1;
char bit6 : 1;
char bit7 : 1;
char bit8 : 1;
};
Nel main() verrebbero così richiamati e utilizzati:
int main(){
struct struttura_campi campo; /* crea una variabile struttura */
campo.bit1 = 0; /* assegna al membro bit1 il valore 0 */
campo.bit2 = 1; /* altro assegnamento */
if (campo.bit1 == campo.bit2) {/* ... */} /* operazione di confronto di un'istruzione if */
/*...
  altre istruzioni...
  ...*/
return 0;
}
Come si può vedere, l'utilizzo dei campi bit è fondamentalmente identico a quello dei normali membri.
È anche possibile utilizzare campi bit e membri normali insieme in un'unica struttura; questo ovviamente avrà i suoi pro e i suoi contro.
NB.: non è obbligatorio dichiarare almeno 8 campi bit come nell'esempio precedente, ne è vietato dichiararne più di 8.
Per esempio questo codice è corretto:
struct struttura_1{ /*questa struttura utilizza solo 2 campi bit */
char bit1 : 1;
char bit2 : 1;
};

struct struttura_2{ /*questa struttura occuperà più byte */
char bit1 : 1;
char bit2 : 1;
char bit3 : 1;
char bit4 : 1;
char bit5 : 1;
char bit6 : 1;
char bit7 : 1;
char bit8 : 1;
char bit_extra :1;
};
RESTRIZIONI:
  • NON è possibile conoscere l'indirizzo di un singolo campo bit.
  • I campi bit NON possono essere static.
  • NON è possibile dichiarare array di campi bit.
  • È possibile riscontrare problemi diversi su sistemi operativi diversi.
  • È possibile avere problemi di altro genere dovuti alla loro implementazione (vi auguro di non averne).