2015-07-09 11 views
8

Ho bisogno di un solo bit per rappresentare i miei dati - 1 o 0. Qual è il modo migliore per farlo in C? I tipi di dati "normali" sono troppo grandi.Tipo di dati più piccolo - posso definire una variabile a un bit?

+1

La memoria è così scarsa che è necessario memorizzare i valori come singoli bit? Per cosa lo stai usando? Forse c'è un modo migliore. –

risposta

5

Se lo si desidera, è possibile creare una struttura con una variabile membro, bit-fielded a 1 bit.

Ricordare che il tipo di dati della variabile membro deve essere unsigned, in quanto è necessario memorizzare 0 e 1.

10

Si potrebbe creare

typedef struct foo 
{ 
    unsigned x:1; 
} foo; 

Dove avete detto al compilatore che userete solo un po 'di x.

Ma a causa delle strutture di impacchettamento della struttura (lo standard C è volutamente flessibile per consentire ai compilatori di ottimizzare in base all'architettura della macchina), è probabile che questo occupi ancora tanto spazio in memoria quanto un normale unsigned e un la serie di foo s non deve essere contigua bit a bit.

0

In genere, il più piccolo pezzo indirizzabile di dati in C è un byte. Non puoi avere un puntatore a un bit, quindi non puoi dichiarare una variabile di dimensione 1 bit. Ma come già sottolineato da Sourav Ghosh, è possibile dichiarare bitfield, a cui è possibile accedere direttamente a un bit.

1

Il modo portatile è la definizione di una variabile che i singoli bit vengono utilizzati come flag.

#define FLAG_FOO 0 
    #define FLAG_BAR 1 

    // in case platform does not support uint8_t 
    typedef unsigned char uint8_t; 

    uint8_t flags; 

    void flag_foo_set() 
    { 
     flags |= (1 << FLAG_FOO); 
    } 

    void flag_foo_clr() 
    { 
     flags &= ~(1 << FLAG_FOO); 
    } 

    uint8_t flag_foo_get() 
    { 
     return flags & (1 << FLAG_FOO); 
    } 

Mentre questo può sembrare superfluo rispetto ai campi di bit C. È portatile praticamente per ogni compilatore C ANSI.

+1

Molto pedanticamente, 'uint8_t' ** deve ** essere supportato da * ogni * compilatore C ANSI? Non ne sono completamente sicuro 'char unsigned 'potrebbe essere una scelta migliore. – Bathsheba

+2

No, i tipi uintX_t sono richiesti solo da C99 - per la portabilità completa, usare 'char unsigned' –

+1

' typedef unsigned char uint8_t; 'sembra potenzialmente pericoloso per me. – Bathsheba

3

Se non si necessita di milioni di di questi flag o si dispone di vincoli di memoria estremamente limitati, il modo migliore è uno int.

Questo perché uno int corrisponde normalmente alla dimensione naturale della parola della piattaforma e può, correttamente allineato, accedere rapidamente. La macchina legge comunque una parola alla volta e l'uso dei singoli bit richiede mascheramento e spostamento, il che costa tempo. Sul tuo tipico PC con gigabyte di RAM, sarebbe semplicemente sciocco.

Se il consumo di memoria in realtà è un problema, ci sono strutture bitfield.

Problemi correlati