Barninga Z
a- a+

I campi di bit

ENTITA' COMPLESSE 

I campi di bit 

Se una variabile di tipo intero può assumere solo unlimitato numero di valori, è teoricamente possibilememorizzarla utilizzando un numero di bit inferiore a quelloassegnatole dal compilatore: basta infatti 1 bit permemorizzare un dato che può assumere solo due valori,2 bit per un dato che può assumere quattro valori, 3bit per uno che può assumere otto valori, ecosì via. 

Il C non ha tipi intrinseci di dati con un numero di bitinferiori a 8 (il char), ma consente di"impaccare" più variabili nel numero di bitstrettamente necessario mediante i cosiddetti campi dibit. 

Un esempio di uso di questo strumento può esserericavato con riferimento alla gestione di una cartellaclinica. Supponiamo di voler gestire, per ogni paziente, leseguenti informazioni: il sesso (maschile o femminile), lostato vitale (vivente, defunto, in coma), il tipo dimedicinale somministrato (sedici categorie, come antibioticie sulfamidici), la categoria di ricovero (otto possibilisistemazioni, da corsia a camera di lusso). In questa ipotesisarebbe possibile codificare il sesso mediante un solo bit,lo stato vitale con 2, il tipo di cura con 4, la sistemazionein ospedale con 3: in totale 10 bit, senz'altrodisponibili in un'unica variabile di tipointero. 

L'uso dei campi di bit prevede la dichiarazione di untemplate: anche in questo caso la somiglianza con lestrutture è palese. 

struct CartellaClinica {    unsigned sesso: 1;    unsigned stato: 2;    unsigned cura: 4;    unsigned letto: 3;};

La dichiarazione utilizza la parola chiave struct,proprio come se si trattasse di un template di struttura; ledichiarazioni dei campi sono introdotte da uno specificatoredi tipo e chiusa dal punto e virgola; la differenza quiconsiste nell'indicazione dell'ampiezza in bit diogni singolo campo, effettuata posponendo al nome del campoil carattere due punti (":")seguito dal numero di bit da assegnare al campo stesso. I duepunti servono, infatti, a indicare la definizione di un campodi bit, la cui ampiezza viene specificata dal numeroseguente; se il numero totale di bit non è disponibilein un'unica variabile intera, il compilatore alloca anchela successiva word in memoria. 

I campi di bit del tipo CartellaClinica sono tuttidichiarati unsigned int: in tal modo tutti i bitsono utilizzabili per esprimere i valori che di volta involta i campi stessi assumeranno. In realtà, i campidi bit possono anche essere dichiarati int, ma inquesto caso il loro bit più significativo rappresentail segno e non è quindi disponibile per memorizzare ilvalore. Un campo dichiarato int ed ampio un solo bitpuò esprimere solo i valori 0 e­1

I campi di bit sono referenziabili esattamente come i campidi una comune struttura: 

enum SEX {    maschile,    femminile};struct CartellaClinica {    unsigned sesso: 1;    unsigned stato: 2;    unsigned cura: 4;    unsigned letto: 3;};char *sessi[] = {    "MASCHILE" ,    "FEMMINILE"};....    struct CartellaClinica Paziente;    ....    Paziente.sesso = maschile;    ....    printf("Sesso del paziente: %s" ,sessi[Paziente.sesso]);

E' importante ricordare come sia compito delprogrammatore assicurarsi che i valori memorizzati nei campidi bit non occupino più bit di quanti ne sono statiloro riservati in fase di definizione del template, dalmomento che le regole del C non assicurano che vengaeffettuato un controllo nelle operazioni di assegnamento divalori ai campi. Se si assegna ad un campo di bit un valoremaggiore del massimo previsto per quel campo, puòaccadere che i bit più significativi di quel valoresiano scritti nei campi successivi: è bene, ancora unavolta, verificare il comportamento del propriocompilatore. 

Naturalmente un campo di bit può essere utilizzatoanche per memorizzare un'informazione di tipoquantitativo: ad esempio, la struct CartellaClinicapotrebbe essere ridefinita mediante l'aggiunta di uncampo atto a memorizzare il numero di ricoveri subiti dalpaziente; impiegando 6 bit tale valore è limitato a63. 

struct CartellaClinica {    unsigned sesso: 1;    unsigned stato: 2;    unsigned cura: 4;    unsigned letto: 3;    unsigned ricoveri: 6;};

Nella nuova definizione, tutti i 16 bit delle due wordoccupate in memoria dalla struct CartellaClinicasono utilizzati.

 



Ti potrebbe interessare anche

commenta la notizia