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?
risposta
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
.
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.
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.
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.
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
No, i tipi uintX_t sono richiesti solo da C99 - per la portabilità completa, usare 'char unsigned' –
' typedef unsigned char uint8_t; 'sembra potenzialmente pericoloso per me. – Bathsheba
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.
- 1. Ottenere prossimo numero più piccolo più vicino a un decimale
- 2. Definire la variabile b dello stesso tipo della variabile a
- 3. Come posso definire una variabile in XAML?
- 4. Esiste un tipo di dati .NET più piccolo di un byte?
- 5. Come definire una variabile in un Dockerfile?
- 6. Definire un nuovo tipo di memoria
- 7. Valutazione di un linguaggio di tipo matematico piccolo che supporta una variabile
- 8. Arduino Tipo di dati dell'oggetto seriale, per creare una variabile contenente un riferimento a una porta
- 9. Quale struttura dati per una matrice di bit di bit?
- 10. Posso definire un puntatore a funzione che punta a un oggetto di tipo std :: function?
- 11. PHP ha un tipo di dati più grande di int?
- 12. Come posso definire e utilizzare una variabile in XAML per definire un colore?
- 13. Haskell Riferimento a una variabile di tipo
- 14. l'esecuzione di una somma bit a bit
- 15. Perché __sync_add_and_fetch funziona per una variabile a 64 bit su un sistema a 32 bit?
- 16. Controllare se una variabile è del tipo di dati double
- 17. Definire una variabile di colore personalizzata
- 18. Come definire un tipo di interfaccia iteratore?
- 19. Come determinare il tipo di dati di una variabile
- 20. Posso definire più blocchi statici?
- 21. Scripting shell: utilizzo di una variabile per definire un percorso
- 22. Definire una proprietà con un tipo di dati misto in Swagger
- 23. Tipo di ritorno di operatori bit a bit in C++
- 24. È possibile dichiarare una variabile a 1 bit in Java?
- 25. Assegnazione destrutturazione ES6 con più di una variabile tipo
- 26. Python bit per bit AND su più numeri, più veloce di un operatore bit a bit iterativo?
- 27. Come e dove definire una variabile di ambiente in azzurro
- 28. Calcola il numero intero più piccolo con k bit impostato maggiore di un altro intero x?
- 29. Perché posso assegnare un valore di tipo diverso a una variabile?
- 30. Come definire un tipo ricorsivo?
La memoria è così scarsa che è necessario memorizzare i valori come singoli bit? Per cosa lo stai usando? Forse c'è un modo migliore. –