Referenz - Bitfelder
Beim Programmieren stößt man gelegentlich auf Aufgaben, bei denen man nur den Status mehrerer Objekte speichern muss, also z. B. aktiv oder nicht aktiv. Für jedes einzelne Objekt eine eigene Integer-Variable zu verwenden wäre Speicherverschwendung, da nur eines der 32 bzw. 64 Bit genutzt wird. In älteren BASIC-Dialekten wurde dieses Problem gelöst, indem man eine INTEGER-Variable benutzt und die einzelnen Bits direkt mit den logischen Operatoren manipuliert.
Beispiel: Der Status von drei Checkboxen soll in einer INTEGER-Variablen gespeichert werden:
CheckBox1 = 1 ' aktiv
CheckBox2 = 0 ' nicht aktiv
CheckBox3 = 1 ' aktiv
GesamtStatus = 0 ' Variable vorbereiten: Alle nicht aktiv
IF CheckBox1 THEN GesamtStatus = GesamtStatus OR 1
IF CheckBox2 THEN GesamtStatus = GesamtStatus OR 2
IF CheckBox3 THEN GesamtStatus = GesamtStatus OR 4
' ...Programmcode...
' Status abfragen:
If GesamtStatus AND 1 THEN CheckBox1 = 1
If GesamtStatus AND 2 THEN CheckBox2 = 1
If GesamtStatus AND 4 THEN CheckBox3 = 1
Das Problem bei dieser Methode ist, dass nicht immer klar ist, welches Bit in 'GesamtStatus' für welche Checkbox steht. Der Programmierer müsste also entweder die Belegung auswendig lernen oder ständig in seinen Notizen nachsehen, wofür welches Bit steht. Beides ist relativ mühselig.
Unter FreeBASIC wurde dieses Problem durch die sogenannten Bitfelder (die Programmierern in C/C++ bereits bekannt sein sollten) gelöst. Ein Bitfeld ist einem UDT ähnlich, unterscheidet sich von einem normalen UDT jedoch dadurch, dass jedem Element der Struktur nur Werte innerhalb eines bestimmten Bereiches zugewiesen werden können. Die Syntax für ein Bitfeld ist die folgende:
TYPE BitFeldName
Bit1Name : Bitanzahl AS INTEGER
Bit2Name : Bitanzahl AS INTEGER
Bit3Name : Bitanzahl AS INTEGER
' ...
END TYPE
DIM Variable AS BitFeldName
In Bitfelder aufteilen lassen sich nur die Datentypen (U)BYTE, (U)SHORT, (U)INTEGER bzw. (U)LONG sowie in der 64bit-Version des Compilers der Datentyp (U)LONGINT. Alle anderen Datentypen erzeugen eine Fehlermeldung des Compilers. Die Namen der Strukturelemente können dabei frei gewählt werden. Es dürfen beliebig viele Attribute verwendet werden. 'Bitanzahl' ist die Anzahl der Bits, die für dieses Attribut verwendet werden sollen. Diese Zahl kann nicht größer sein als die Anzahl der Bits, die im angegebenen Datentyp gespeichert werden kann.
Beispiel: Checkbox-Verwaltung mit Bitfeldern:
TYPE CheckBoxenType
CB1 : 1 AS INTEGER
CB2 : 1 AS INTEGER
CB3 : 1 AS INTEGER
END TYPE
DIM CheckBoxen AS CheckBoxenType
' Status setzen:
CheckBoxen.CB1 = 1 ' aktiv
CheckBoxen.CB2 = 0 ' nicht aktiv
CheckBoxen.CB3 = 1 ' aktiv
' ... Programmcode ...
' Status abfragen:
IF CheckBoxen.CB1 THEN PRINT "Bit 1 ist gesetzt."
IF CheckBoxen.CB2 THEN PRINT "Bit 2 ist gesetzt."
IF CheckBoxen.CB3 THEN PRINT "Bit 3 ist gesetzt."
SLEEP
Man erspart sich hierbei die umständliche Bitmanipulation mit AND und OR, außerdem ist sofort klar, welcher Wert gerade bearbeitet wird. Ein weiterer Vorteil ist, dass die Bitzahl nicht 1 sein muss; so können auch Checkboxen mit drei Zuständen realisiert werden (aktiviert/nicht aktiviert/nicht festgelegt).
Beispiel:
TYPE a
a1 : 2 AS INTEGER
a2 : 2 AS INTEGER
END TYPE
DIM b AS a
b.a1 = 5
PRINT b.a1
SLEEP
Ausgabe:
1
5 ist in Binär &b101. Da für das Attribut a1 nur zwei Bits verwendet werden, ignoriert FreeBASIC das dritte Bit. Statt &b101 wird in a1 also nur &b01 gespeichert, was 1 entspricht.
Zusätzliche Informationen und Funktionen | ||||
---|---|---|---|---|
|