Kontakt
DSVGO
Option Explicit Private Const cLongBits As Long = 32 Private Const cLongMaxIndex As Long = cLongBits - 1 Private pBits() As Long Private pBitVal(0 To cLongMaxIndex) As Long Private pBitValNot(0 To cLongMaxIndex) As Long Private pCount As Long Private i As LongDa 2er-Potenzen relativ langsam mit VB zu berechnen sind, werden diese bei der Instanziierung der Klasse vorab berechnet (Diese Zahlen werden für die Bit-Arithmetik benötigt.); Ausserdem wird die Größe des BitArray gerade auf die Anzahl der Bits in einem Long voreingestellt:
Private Sub Class_Initialize() pBitVal(0) = 1 For i = 1 To cLongMaxIndex - 1 pBitVal(i) = pBitVal(i - 1) * 2 Next i pBitVal(cLongMaxIndex) = &H80000000 For i = 0 To cLongMaxIndex pBitValNot(i) = Not pBitVal(i) Next i Bits = cLongBits End SubDie Größe des "Bit-Array" wird durch die Bits-Eigenschaft bestimmt; Die Größe des internen Long-Array ergibt sich aus der Anzahl der zu speichernden Bits, dividiert durch die Anzahl der Bits in einem Long: (Man beachte, dass die Größenanderung bereits gesetzte Bits erhält.)
Public Property Get Bits() As Long Bits = pCount End Property Public Property Let Bits( _ ByVal Value As Long) pCount = Value i = (pCount - 1&) \ cLongBits ReDim Preserve pBits(0 To i) End PropertySoll ein bestimtes Bit gelesen oder gesetzt werden, so muss einerseits die Position des Bits im Long-Array bestimmt werden (via Division durch die Anzahl der Bits in einem Long); Andererseits muss die Position des Bits im zuständigen Long bestimmt werden (entspricht dem Rest der Division; hier schnell durch einen logischen Ausdruck berechnet):
Public Property Get Bit( _ ByVal Index As Long) As Boolean Bit = CBool(pBits(Index \ cLongBits) And _ pBitVal(Index And cLangMaxIndex)) End Property Public Property Let Bit( _ ByVal Index As Long, _ ByVal Flag As Boolean) i = Index \ cLongBits If Flag Then pBits(i) = pBits(i) Or _ pBitVal(Index And cLongMaxIndex) Else pBits(i) = pBits(i) And _ pBitValNot(Index And cLongMaxIndex) End If End PropertyDie beiden folgenden Methoden dienen zum Löschen aller Bits bzw. zur Generierung der Text-Darstellung der Bits:
Public Sub Clear() i = (pCount - 1&) \ cLongBits ReDim pBits(0 To i) End Sub Public Property Get ToString() As String ToString = String$(pCount, "0") For i = 0 To pCount - 1 If Bit(i) Then _ Mid$(ToString, pCount - i, 1) = "1" Next i End PropertyHier nun ein kleines Beispiel zur Nutzung der Klasse. Als erstes muss eine Klassenvariable deklariert werden; Diese muss vor Nutzung instanziiert werden und ggf. die benötigte Größe eingestellt werden:
Private bitsTest As BitArray Private Sub Form_Load() Set bitsTest = New BitArray bitsTest.Bits = 8 End SubNun kann das BitArray-Objekt nach Herzenslust benutzt werden, beispielsweise:
bitsTest.Bit(7) = True bitsTest.Bit(6) = True bitsTest.Bit(0) = True bitsTest.Bit(7) = False MsgBox bitsTest.ToStringDie MessageBox gibt folgenden String (ohne Anführungszeichen) aus: "01000001"
© Jost Schwider, 30.09.2000-30.09.2000 - http://vb-tec.de/bitarray.htm