Come usare i bitfield

Scritto da  Daniele Rongione il venerdì 15 ottobre 2010  •  Linguaggio: C#,VB   • 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

 
x