2011-09-02 5 views
6

in C o C++, è evidentemente possibile limitare il numero di bit una variabile ha, quindi, ad esempio:impostazione Bit domanda

unsigned char A:1; 
unsigned char B:3; 

Sono familiarità ma con come funziona nello specifico, in modo da un certo numero di domande :

Se ho una classe con le seguenti variabili:

unsigned char A:1; 
unsigned char B:3; 
unsigned char C:1; 
unsigned char D:3; 
  1. Qual è la tecnica di cui sopra effettivamente chiamato?
  2. È sopra la classe quattro byte di dimensione o un byte di dimensione?
  3. Le variabili sono trattate come 1 (o 3) bit come mostrato, o come per il 'carattere non firmato', trattato come un byte ciascuno?
  4. C'è qualche modo di combinare i bit con un byte centralizzato? Ad esempio:

.

unsigned char MainByte; 
unsigned char A:1; //Can this be made to point at the first bit in MainByte? 
unsigned char B:3; //Etc etc 
unsigned char C:1; 
unsigned char D:3; 
  1. C'è un articolo che tratta questo argomento in modo più approfondito?
  2. Se 'A: 1' è trattato come un intero byte, qual è il punto/viola di esso?

Sentitevi liberi di menzionare qualsiasi altra considerazione (come restrizioni del compilatore o altre limitazioni).

Grazie.

+3

Il nome che stai cercando è bitfields –

+0

Suppongo che dovrei chiedere: stai usando C o C++? E se C++, stai usando questo in una classe non POD? Ho la sensazione che C++ limiti i bitfield ai tipi di struct POD. –

+0

C++. Sto includendo btoh quindi conosco entrambe le differenze delle specifiche (e anche per ampliare le soluzioni applicabili). E sì, lo sto usando in una classe (anche se è in fase di progettazione al momento), se può essere usato solo come una struttura che posso facilmente cambiare però. È per un programma di caricamento di immagini GIF. – SSight3

risposta

8

Qual è la tecnica sopra indicata?

Campi bit. E devi solo usare int (signed, unsigned o altro) come "tipo", non char.

È di classe quattro byte di dimensioni o un byte di dimensione?

Nessuno dei due. È probabilmente sizeof(int) perché il compilatore genera un oggetto di dimensioni word. Tuttavia, i bitfield effettivi verranno memorizzati all'interno di un byte. Sarà solo sprecare un po 'di spazio.

Le variabili sono trattate come 1 (o 3) bit come mostrato, o come per il 'carattere senza segno', trattati come byte ciascuno?

Rappresentano solo i bit specificati e verranno imballati il ​​più strettamente possibile.

C'è qualche modo di combinare i bit con un byte centralizzato? Così, per esempio:

Utilizzare un union:

struct bits { 
    unsigned A:1; 
    unsigned B:3; 
    unsigned C:1; 
    unsigned D:3; 
}; 

union SplitByte { 
    struct bits Bits; 
    unsigned char Byte[sizeof(struct bits)]; 
    /* the array is a trick so the two fields 
    are guaranteed to be the same size and 
    thus be aligned on the same boundary */ 
} SplitByteObj; 

// access the byte 
SplitByteObj.Byte[0] 

// access a bitfield 
SplitByteObj.Bits.B 

Nota che ci sono problemi con campi di bit, ad esempio quando si usano le discussioni. Non è possibile accedere a ciascun bitfield singolarmente, pertanto è possibile che si verifichino degli errori se si tenta di utilizzare un mutex per proteggerli. Inoltre, l'ordine in cui sono disposti i campi non è chiaramente specificato dallo standard. Molte persone preferiscono utilizzare operatori bit a bit per implementare manualmente i bitfield per tale motivo.

C'è un articolo che tratta questo argomento in modo più approfondito?

Non molti. I primi che avrai quando Google è tutto ciò che troverai. Non sono un costrutto ampiamente utilizzato. Farai meglio a spulciare lo standard per capire esattamente come funzionano in modo da non essere morsi da uno strano caso limite. Non potrei dirti esattamente dove sono specificati nello standard.

Se 'A: 1' viene trattato come un intero byte, qual è il punto/viola di esso?

Non lo è, ma ho già parlato di questo.

+0

+1 per 'usare int (firmato, non firmato o altro) come" tipo ", non char. – Sadique

+0

Praticamente gli unici requisiti sono stabiliti in C99 6.7.2.1/10. Non ci sono molti requisiti. –

+0

Grazie per le informazioni molto dettagliate. – SSight3

5

Questi sono campi .

I dettagli di come questi campi sono disposti in memoria sono in gran parte definiti dall'implementazione. In genere, troverete che il compilatore li racchiude in qualche modo. Ma potrebbero essere necessari vari problemi di allineamento.

+0

Grazie per il tuo contributo. – SSight3