Cos’è una maschera di bit
Una maschera di bit è un numero usato per il suo schema di bit e non per il suo valore. Ogni posizione di bit rappresenta un’opzione acceso/spento, così un singolo intero può contenere 8, 32 o 64 flag alla volta. I permessi (rwx), le modalità di apertura dei file, i bit di funzionalità della CPU, le maschere di rete e gli insiemi di opzioni di quasi ogni API in C sono maschere di bit.
Il bit n vale 2ⁿ, quindi una maschera con i bit 0, 2 e 7 impostati è 1 + 4 + 128 = 133 = 0x85 = 1000 0101. La costante nel codice si costruisce spostando un 1 nella posizione: 1 << 7.
Usare una maschera
| Obiettivo | Come |
|---|---|
| Verificare se un flag è impostato | (value & FLAG) != 0 |
| Verificare se più flag sono tutti impostati | (value & MASK) == MASK |
| Impostare un flag | value |= FLAG |
| Azzerare un flag | value &= ~FLAG |
| Invertire un flag | value ^= FLAG |
| Estrarre un campo dai bit 4–7 | (value >> 4) & 0xF |
| Costruire una maschera per i bit lo..hi | ((1 << (hi - lo + 1)) - 1) << lo |
Leggere una maschera data
Converti il valore in binario e numera i bit da destra partendo da 0. Ogni 1 è un flag impostato. Lo strumento qui sopra lo fa per qualsiasi valore incolli e mostra le posizioni come lista compatta, ad esempio 0-2, 5, 7.
Esempi
Domande
Perché le posizioni dei bit partono da 0?
Perché il bit n vale 2ⁿ e 2⁰ = 1 è il bit più a destra. Contare da 0 fa tornare i conti: spostare di n mette un 1 nel bit n.
Qual è la differenza tra maschera di bit e campo di bit?
Una maschera di bit è il numero con cui fai AND o OR. Un campo di bit è un gruppo di bit adiacenti dentro un valore più grande che insieme memorizzano un numero piccolo (per esempio i bit 4–7 con un valore da 0 a 15). Per leggere o scrivere un campo di bit si usano una maschera e uno scorrimento.
Quanti flag stanno in un intero?
Uno per bit: 8 in un byte, 32 in un int a 32 bit, 64 in uno a 64 bit. Se te ne servono di più, usa un array di interi o un tipo bitset dedicato.
Perché 1 << n invece del numero stesso?
Documenta quale bit si intende e non può essere scritto male come un’altra potenza di due. I compilatori lo riducono a una costante, quindi non costa nulla a runtime.
Lo strumento gestisce correttamente le maschere a 64 bit?
Sì. Calcola con interi a precisione arbitraria, quindi tutti i 64 bit sono esatti, compreso il bit 63.