Come usare i bitfield
Scritto da
Daniele Rongione il
venerdì 15 ottobre 2010
•
Linguaggio:
• Livello: 100
Un bitfield è il modo più compatto per memorizzare una serie di
flag utilizzando una sola variabile. Il numero di flag impostabili
dipende dalla dimensione in bit del tipo della variabile.
I flag possono essere dichiarati in un enum a cui va associato
l'attributo Flags.
C#
// Dichiarazione dei flag.
// Per semplicità di lettura viene utilizzato l'operatore
// di bit shifting che sposta a sinistra il bit di n posizioni.
[Flags]
enum myFlags
{
Nessuno = 0,
Primo = (1 << 0), // = 00000000 00000001 = 1
Secondo = (1 << 1), // = 00000000 00000010 = 2
Terzo = (1 << 2), // = 00000000 00000100 = 4
Quarto = (1 << 3) // = 00000000 00001000 = 8
}
// Dichiarazione del bitfield.
// Il tipo short può contenere fino a 16 flag.
short bitfield = 0; // = 00000000 00000000
// Impostazione di un flag.
bitfield |= (short)myFlags.Secondo; // = 00000000 00000010
// Impostazione di più flag contemporaneamente.
bitfield |=(short)(myFlags.Primo | myFlags.Quarto); // = 00000000 00001011
// Controllo dello stato di un flag.
boolisFlaggedTerzo = ((bitfield & (int)myFlags.Terzo) != 0); // = false
boolisFlaggedQuarto = ((bitfield & (int)myFlags.Quarto) != 0); // = true
// Reset del quarto flag.
bitfield &= (short) ~myFlags.Quarto; // = 00000000 0000011
VB
' Dichiarazione dei flag.
' Per semplicità di lettura viene utilizzato l'operatore
' di bit shifting che sposta a sinistra il bit di n posizioni.
<Flags> _
Enum myFlags
Nessuno = 0,
Primo = (1 << 0), ' = 00000000 00000001 = 1
Secondo = (1 << 1), ' = 00000000 00000010 = 2
Terzo = (1 << 2), ' = 00000000 00000100 = 4
Quarto = (1 << 3) ' = 00000000 00001000 = 8
End Enum
' Dichiarazione del bitfield.
' Il tipo short può contenere fino a 16 flag.
Dim bitfield As Short = 0 ' = 00000000 00000000
' Impostazione di un flag.
bitfield = bitfield Or myFlags.Secondo ' = 00000000 00000010
' Impostazione di più flag contemporaneamente.
bitfield = bitfield Or myFlags.Primo Or myFlags.Quarto ' = 00000000 00001011
' Controllo dello stato di un flag.
Dim isFlagged2 As Boolean = ((bitfield And myFlags.Terzo) <> 0) ' = false
Dim isFlagged3 As Boolean = ((bitfield And myFlags.Quarto) <> 0) ' = true
' Reset del quarto flag.
bitfield = bitfield And Not myFlags.Quarto ' = 00000000 0000011
Tags: bitfield