Public Class TBitArray
\'Byte array used to store bits
Private BA As Byte() = {}
\'Actual size of bit array (number of elements)
Private _Length As Integer = 0
\'Bit value lookup table
Private Shared ReadOnly Table(,) As Byte =
{{0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 1}, {0, 0, 0, 0, 0, 0, 1, 0}, {0, 0, 0, 0, 0, 0, 1, 1},
{0, 0, 0, 0, 0, 1, 0, 0}, {0, 0, 0, 0, 0, 1, 0, 1}, {0, 0, 0, 0, 0, 1, 1, 0}, {0, 0, 0, 0, 0, 1, 1, 1},
{0, 0, 0, 0, 1, 0, 0, 0}, {0, 0, 0, 0, 1, 0, 0, 1}, {0, 0, 0, 0, 1, 0, 1, 0}, {0, 0, 0, 0, 1, 0, 1, 1},
{0, 0, 0, 0, 1, 1, 0, 0}, {0, 0, 0, 0, 1, 1, 0, 1}, {0, 0, 0, 0, 1, 1, 1, 0}, {0, 0, 0, 0, 1, 1, 1, 1},
{0, 0, 0, 1, 0, 0, 0, 0}, {0, 0, 0, 1, 0, 0, 0, 1}, {0, 0, 0, 1, 0, 0, 1, 0}, {0, 0, 0, 1, 0, 0, 1, 1},
{0, 0, 0, 1, 0, 1, 0, 0}, {0, 0, 0, 1, 0, 1, 0, 1}, {0, 0, 0, 1, 0, 1, 1, 0}, {0, 0, 0, 1, 0, 1, 1, 1},
{0, 0, 0, 1, 1, 0, 0, 0}, {0, 0, 0, 1, 1, 0, 0, 1}, {0, 0, 0, 1, 1, 0, 1, 0}, {0, 0, 0, 1, 1, 0, 1, 1},
{0, 0, 0, 1, 1, 1, 0, 0}, {0, 0, 0, 1, 1, 1, 0, 1}, {0, 0, 0, 1, 1, 1, 1, 0}, {0, 0, 0, 1, 1, 1, 1, 1},
{0, 0, 1, 0, 0, 0, 0, 0}, {0, 0, 1, 0, 0, 0, 0, 1}, {0, 0, 1, 0, 0, 0, 1, 0}, {0, 0, 1, 0, 0, 0, 1, 1},
{0, 0, 1, 0, 0, 1, 0, 0}, {0, 0, 1, 0, 0, 1, 0, 1}, {0, 0, 1, 0, 0, 1, 1, 0}, {0, 0, 1, 0, 0, 1, 1, 1},
{0, 0, 1, 0, 1, 0, 0, 0}, {0, 0, 1, 0, 1, 0, 0, 1}, {0, 0, 1, 0, 1, 0, 1, 0}, {0, 0, 1, 0, 1, 0, 1, 1},
{0, 0, 1, 0, 1, 1, 0, 0}, {0, 0, 1, 0, 1, 1, 0, 1}, {0, 0, 1, 0, 1, 1, 1, 0}, {0, 0, 1, 0, 1, 1, 1, 1},
{0, 0, 1, 1, 0, 0, 0, 0}, {0, 0, 1, 1, 0, 0, 0, 1}, {0, 0, 1, 1, 0, 0, 1, 0}, {0, 0, 1, 1, 0, 0, 1, 1},
{0, 0, 1, 1, 0, 1, 0, 0}, {0, 0, 1, 1, 0, 1, 0, 1}, {0, 0, 1, 1, 0, 1, 1, 0}, {0, 0, 1, 1, 0, 1, 1, 1},
{0, 0, 1, 1, 1, 0, 0, 0}, {0, 0, 1, 1, 1, 0, 0, 1}, {0, 0, 1, 1, 1, 0, 1, 0}, {0, 0, 1, 1, 1, 0, 1, 1},
{0, 0, 1, 1, 1, 1, 0, 0}, {0, 0, 1, 1, 1, 1, 0, 1}, {0, 0, 1, 1, 1, 1, 1, 0}, {0, 0, 1, 1, 1, 1, 1, 1},
{0, 1, 0, 0, 0, 0, 0, 0}, {0, 1, 0, 0, 0, 0, 0, 1}, {0, 1, 0, 0, 0, 0, 1, 0}, {0, 1, 0, 0, 0, 0, 1, 1},
{0, 1, 0, 0, 0, 1, 0, 0}, {0, 1, 0, 0, 0, 1, 0, 1}, {0, 1, 0, 0, 0, 1, 1, 0}, {0, 1, 0, 0, 0, 1, 1, 1},
{0, 1, 0, 0, 1, 0, 0, 0}, {0, 1, 0, 0, 1, 0, 0, 1}, {0, 1, 0, 0, 1, 0, 1, 0}, {0, 1, 0, 0, 1, 0, 1, 1},
{0, 1, 0, 0, 1, 1, 0, 0}, {0, 1, 0, 0, 1, 1, 0, 1}, {0, 1, 0, 0, 1, 1, 1, 0}, {0, 1, 0, 0, 1, 1, 1, 1},
{0, 1, 0, 1, 0, 0, 0, 0}, {0, 1, 0, 1, 0, 0, 0, 1}, {0, 1, 0, 1, 0, 0, 1, 0}, {0, 1, 0, 1, 0, 0, 1, 1},
{0, 1, 0, 1, 0, 1, 0, 0}, {0, 1, 0, 1, 0, 1, 0, 1}, {0, 1, 0, 1, 0, 1, 1, 0}, {0, 1, 0, 1, 0, 1, 1, 1},
{0, 1, 0, 1, 1, 0, 0, 0}, {0, 1, 0, 1, 1, 0, 0, 1}, {0, 1, 0, 1, 1, 0, 1, 0}, {0, 1, 0, 1, 1, 0, 1, 1},
{0, 1, 0, 1, 1, 1, 0, 0}, {0, 1, 0, 1, 1, 1, 0, 1}, {0, 1, 0, 1, 1, 1, 1, 0}, {0, 1, 0, 1, 1, 1, 1, 1},
{0, 1, 1, 0, 0, 0, 0, 0}, {0, 1, 1, 0, 0, 0, 0, 1}, {0, 1, 1, 0, 0, 0, 1, 0}, {0, 1, 1, 0, 0, 0, 1, 1},
{0, 1, 1, 0, 0, 1, 0, 0}, {0, 1, 1, 0, 0, 1, 0, 1}, {0, 1, 1, 0, 0, 1, 1, 0}, {0, 1, 1, 0, 0, 1, 1, 1},
{0, 1, 1, 0, 1, 0, 0, 0}, {0, 1, 1, 0, 1, 0, 0, 1}, {0, 1, 1, 0, 1, 0, 1, 0}, {0, 1, 1, 0, 1, 0, 1, 1},
{0, 1, 1, 0, 1, 1, 0, 0}, {0, 1, 1, 0, 1, 1, 0, 1}, {0, 1, 1, 0, 1, 1, 1, 0}, {0, 1, 1, 0, 1, 1, 1, 1},
{0, 1, 1, 1, 0, 0, 0, 0}, {0, 1, 1, 1, 0, 0, 0, 1}, {0, 1, 1, 1, 0, 0, 1, 0}, {0, 1, 1, 1, 0, 0, 1, 1},
{0, 1, 1, 1, 0, 1, 0, 0}, {0, 1, 1, 1, 0, 1, 0, 1}, {0, 1, 1, 1, 0, 1, 1, 0}, {0, 1, 1, 1, 0, 1, 1, 1},
{0, 1, 1, 1, 1, 0, 0, 0}, {0, 1, 1, 1, 1, 0, 0, 1}, {0, 1, 1, 1, 1, 0, 1, 0}, {0, 1, 1, 1, 1, 0, 1, 1},
{0, 1, 1, 1, 1, 1, 0, 0}, {0, 1, 1, 1, 1, 1, 0, 1}, {0, 1, 1, 1, 1, 1, 1, 0}, {0, 1, 1, 1, 1, 1, 1, 1},
{1, 0, 0, 0, 0, 0, 0, 0}, {1, 0, 0, 0, 0, 0, 0, 1}, {1, 0, 0, 0, 0, 0, 1, 0}, {1, 0, 0, 0, 0, 0, 1, 1},
{1, 0, 0, 0, 0, 1, 0, 0}, {1, 0, 0, 0, 0, 1, 0, 1}, {1, 0, 0, 0, 0, 1, 1, 0}, {1, 0, 0, 0, 0, 1, 1, 1},
{1, 0, 0, 0, 1, 0, 0, 0}, {1, 0, 0, 0, 1, 0, 0, 1}, {1, 0, 0, 0, 1, 0, 1, 0}, {1, 0, 0, 0, 1, 0, 1, 1},
{1, 0, 0, 0, 1, 1, 0, 0}, {1, 0, 0, 0, 1, 1, 0, 1}, {1, 0, 0, 0, 1, 1, 1, 0}, {1, 0, 0, 0, 1, 1, 1, 1},
{1, 0, 0, 1, 0, 0, 0, 0}, {1, 0, 0, 1, 0, 0, 0, 1}, {1, 0, 0, 1, 0, 0, 1, 0}, {1, 0, 0, 1, 0, 0, 1, 1},
{1, 0, 0, 1, 0, 1, 0, 0}, {1, 0, 0, 1, 0, 1, 0, 1}, {1, 0, 0, 1, 0, 1, 1, 0}, {1, 0, 0, 1, 0, 1, 1, 1},
{1, 0, 0, 1, 1, 0, 0, 0}, {1, 0, 0, 1, 1, 0, 0, 1}, {1, 0, 0, 1, 1, 0, 1, 0}, {1, 0, 0, 1, 1, 0, 1, 1},
{1, 0, 0, 1, 1, 1, 0, 0}, {1, 0, 0, 1, 1, 1, 0, 1}, {1, 0, 0, 1, 1, 1, 1, 0}, {1, 0, 0, 1, 1, 1, 1, 1},
{1, 0, 1, 0, 0, 0, 0, 0}, {1, 0, 1, 0, 0, 0, 0, 1}, {1, 0, 1, 0, 0, 0, 1, 0}, {1, 0, 1, 0, 0, 0, 1, 1},
{1, 0, 1, 0, 0, 1, 0, 0}, {1, 0, 1, 0, 0, 1, 0, 1}, {1, 0, 1, 0, 0, 1, 1, 0}, {1, 0, 1, 0, 0, 1, 1, 1},
{1, 0, 1, 0, 1, 0, 0, 0}, {1, 0, 1, 0, 1, 0, 0, 1}, {1, 0, 1, 0, 1, 0, 1, 0}, {1, 0, 1, 0, 1, 0, 1, 1},
{1, 0, 1, 0, 1, 1, 0, 0}, {1, 0, 1, 0, 1, 1, 0, 1}, {1, 0, 1, 0, 1, 1, 1, 0}, {1, 0, 1, 0, 1, 1, 1, 1},
{1, 0, 1, 1, 0, 0, 0, 0}, {1, 0, 1, 1, 0, 0, 0, 1}, {1, 0, 1, 1, 0, 0, 1, 0}, {1, 0, 1, 1, 0, 0, 1, 1},
{1, 0, 1, 1, 0, 1, 0, 0}, {1, 0, 1, 1, 0, 1, 0, 1}, {1, 0, 1, 1, 0, 1, 1, 0}, {1, 0, 1, 1, 0, 1, 1, 1},
{1, 0, 1, 1, 1, 0, 0, 0}, {1, 0, 1, 1, 1, 0, 0, 1}, {1, 0, 1, 1, 1, 0, 1, 0}, {1, 0, 1, 1, 1, 0, 1, 1},
{1, 0, 1, 1, 1, 1, 0, 0}, {1, 0, 1, 1, 1, 1, 0, 1}, {1, 0, 1, 1, 1, 1, 1, 0}, {1, 0, 1, 1, 1, 1, 1, 1},
{1, 1, 0, 0, 0, 0, 0, 0}, {1, 1, 0, 0, 0, 0, 0, 1}, {1, 1, 0, 0, 0, 0, 1, 0}, {1, 1, 0, 0, 0, 0, 1, 1},
{1, 1, 0, 0, 0, 1, 0, 0}, {1, 1, 0, 0, 0, 1, 0, 1}, {1, 1, 0, 0, 0, 1, 1, 0}, {1, 1, 0, 0, 0, 1, 1, 1},
{1, 1, 0, 0, 1, 0, 0, 0}, {1, 1, 0, 0, 1, 0, 0, 1}, {1, 1, 0, 0, 1, 0, 1, 0}, {1, 1, 0, 0, 1, 0, 1, 1},
{1, 1, 0, 0, 1, 1, 0, 0}, {1, 1, 0, 0, 1, 1, 0, 1}, {1, 1, 0, 0, 1, 1, 1, 0}, {1, 1, 0, 0, 1, 1, 1, 1},
{1, 1, 0, 1, 0, 0, 0, 0}, {1, 1, 0, 1, 0, 0, 0, 1}, {1, 1, 0, 1, 0, 0, 1, 0}, {1, 1, 0, 1, 0, 0, 1, 1},
{1, 1, 0, 1, 0, 1, 0, 0}, {1, 1, 0, 1, 0, 1, 0, 1}, {1, 1, 0, 1, 0, 1, 1, 0}, {1, 1, 0, 1, 0, 1, 1, 1},
{1, 1, 0, 1, 1, 0, 0, 0}, {1, 1, 0, 1, 1, 0, 0, 1}, {1, 1, 0, 1, 1, 0, 1, 0}, {1, 1, 0, 1, 1, 0, 1, 1},
{1, 1, 0, 1, 1, 1, 0, 0}, {1, 1, 0, 1, 1, 1, 0, 1}, {1, 1, 0, 1, 1, 1, 1, 0}, {1, 1, 0, 1, 1, 1, 1, 1},
{1, 1, 1, 0, 0, 0, 0, 0}, {1, 1, 1, 0, 0, 0, 0, 1}, {1, 1, 1, 0, 0, 0, 1, 0}, {1, 1, 1, 0, 0, 0, 1, 1},
{1, 1, 1, 0, 0, 1, 0, 0}, {1, 1, 1, 0, 0, 1, 0, 1}, {1, 1, 1, 0, 0, 1, 1, 0}, {1, 1, 1, 0, 0, 1, 1, 1},
{1, 1, 1, 0, 1, 0, 0, 0}, {1, 1, 1, 0, 1, 0, 0, 1}, {1, 1, 1, 0, 1, 0, 1, 0}, {1, 1, 1, 0, 1, 0, 1, 1},
{1, 1, 1, 0, 1, 1, 0, 0}, {1, 1, 1, 0, 1, 1, 0, 1}, {1, 1, 1, 0, 1, 1, 1, 0}, {1, 1, 1, 0, 1, 1, 1, 1},
{1, 1, 1, 1, 0, 0, 0, 0}, {1, 1, 1, 1, 0, 0, 0, 1}, {1, 1, 1, 1, 0, 0, 1, 0}, {1, 1, 1, 1, 0, 0, 1, 1},
{1, 1, 1, 1, 0, 1, 0, 0}, {1, 1, 1, 1, 0, 1, 0, 1}, {1, 1, 1, 1, 0, 1, 1, 0}, {1, 1, 1, 1, 0, 1, 1, 1},
{1, 1, 1, 1, 1, 0, 0, 0}, {1, 1, 1, 1, 1, 0, 0, 1}, {1, 1, 1, 1, 1, 0, 1, 0}, {1, 1, 1, 1, 1, 0, 1, 1},
{1, 1, 1, 1, 1, 1, 0, 0}, {1, 1, 1, 1, 1, 1, 0, 1}, {1, 1, 1, 1, 1, 1, 1, 0}, {1, 1, 1, 1, 1, 1, 1, 1}}
\'Gets or sets a bit at a specified index
Default Property Bit(ByVal index As Integer) As Boolean
Get
Dim _byte As Integer = Math.Floor(index / 8)
Dim _pos As Byte = index Mod 8
If index > -1 AndAlso index < _Length AndAlso _byte < BA.Length Then Return Table(BA(_byte), _pos) Else _
Throw New ArgumentOutOfRangeException(index)
End Get
Set(ByVal value As Boolean)
Dim _byte As Integer = Math.Floor(index / 8)
Dim _pos As Byte = index Mod 8
Dim bool As Boolean = Table(BA(_byte), _pos)
If index > -1 AndAlso index < _Length AndAlso _byte < BA.Length Then
If value Then
If Not bool Then
Select Case _pos
Case 0 : BA(_byte) += 128
Case 1 : BA(_byte) += 64
Case 2 : BA(_byte) += 32
Case 3 : BA(_byte) += 16
Case 4 : BA(_byte) += 8
Case 5 : BA(_byte) += 4
Case 6 : BA(_byte) += 2
Case 7 : BA(_byte) += 1
End Select
End If
Else
If bool Then
Select Case _pos
Case 0 : BA(_byte) -= 128
Case 1 : BA(_byte) -= 64
Case 2 : BA(_byte) -= 32
Case 3 : BA(_byte) -= 16
Case 4 : BA(_byte) -= 8
Case 5 : BA(_byte) -= 4
Case 6 : BA(_byte) -= 2
Case 7 : BA(_byte) -= 1
End Select
End If
End If
Else
Throw New ArgumentOutOfRangeException(index)
End If
End Set
End Property
\'Gets or Sets the byte at specified index
Public Property ByteElements(ByVal index As Integer) As Byte
Get
If index > -1 AndAlso index < BA.Length Then Return BA(index) Else _
Throw New ArgumentOutOfRangeException(index)
End Get
Set(value As Byte)
If index > -1 AndAlso index < BA.Length Then BA(index) = value Else _
Throw New ArgumentOutOfRangeException(index)
End Set
End Property
\'Get length of bit array
Public ReadOnly Property Length() As Integer
Get
Return _Length
End Get
End Property
\'Get number of bytes allocated to the byte array used for the bit array
Public ReadOnly Property Size() As Integer
Get
Return BA.Length
End Get
End Property
\'Resizes the bit array
Public Sub Resize(ByVal Size As Integer, Optional ByVal Preserve As Boolean = False)
If Size > -1 Then
If Preserve Then ReDim Preserve BA(Math.Floor(Size / 8)) Else ReDim BA(Math.Floor(Size / 8))
_Length = Size + 1
End If
End Sub
\'Returns the Byte Array used to store the bits
Public Function GetByteArray() As Byte()
Return BA
End Function
\'Returns the BitArray as a string
Public Overrides Function ToString() As String
Dim str(_Length - 1) As Char
For i = 0 To _Length - 1
If Bit(i) Then str(i) = "1" Else str(i) = "0"
Next
Return str
End Function
\'Sets the bits starting from the beginning
Public Sub SetBits(ByRef Values() As Boolean)
If Values.Length > _Length Then
Throw New ArgumentOutOfRangeException(Values.Length)
Else
For i = 0 To Values.Length - 1 : Bit(i) = Values(i) : Next
End If
End Sub
\'Sets the bits starting from the given index
Public Sub SetBits(ByVal index As Integer, ByRef Values() As Boolean)
If Values.Length + index > _Length Then
Throw New ArgumentOutOfRangeException(Values.Length)
Else
For i = 0 To Values.Length - 1 : Bit(index) = Values(i) : index += 1 : Next
End If
End Sub
\'Sets the bits starting from the given index for a given length
Public Sub SetBits(ByVal index As Integer, ByVal length As Integer, ByRef Values() As Boolean)
Dim l As Integer = length + index
If index > _Length - 1 OrElse l > _Length Then
Throw New ArgumentOutOfRangeException(l)
Else
For i = 0 To length - 1 : Bit(index) = Values(i) : index += 1 : Next
End If
End Sub
\'Gets the entire array as a boolean array representing bits
Public Function GetBits() As Boolean()
Dim l As Integer = _Length - 1
Dim bools(l) As Boolean
For i = 0 To l : bools(i) = Bit(i) : Next
Return bools
End Function
\'Gets a range of bits from the beginning of the array
Public Function GetBits(ByVal length As Integer) As Boolean()
If length > _Length Then
Throw New ArgumentOutOfRangeException(length)
Else
Dim l As Integer = length - 1
Dim bools(l) As Boolean
For i = 0 To l : bools(i) = Bit(i) : Next
Return bools
End If
End Function
\'Returns boolean array representation of an integer
Public Shared Function ConvertToBinaryArray(ByVal Value As Integer) As Boolean()
If Value = 0 Then Return {False}
Dim bools() As Boolean = {}, pow As Integer = 0, index As Integer = 1
While True
If 2 ^ pow > Value Then
pow -= 1
ReDim bools(pow)
bools(0) = True
Value -= 2 ^ pow
pow -= 1
For i = pow To 0 Step -1
If 2 ^ pow > Value Then
bools(index) = False
Else
bools(index) = True
Value -= 2 ^ pow
End If
index += 1
pow -= 1
Next
Return bools
Else
pow += 1
End If
End While
Return {}
End Function
\'Gets a range of bits from a specified index for a given length in the array
Public Function GetBits(ByVal index As Integer, ByVal length As Integer) As Boolean()
If index + length > _Length Then
Throw New ArgumentOutOfRangeException(length)
Else
Dim l As Integer = length - 1, t As Integer = 0
Dim bools(l) As Boolean
For i = index To index + l : bools(t) = Bit(i) : t += 1 : Next
Return bools
End If
End Function
\'Loads a byte Array as the Array Used to store bits
Public Sub LoadArray(ByVal Bytes() As Byte)
BA = Bytes
_Length = Bytes.Length * 8
End Sub
\'Creates a new TBitArray with given size
Sub New(Optional Size As Integer = -1)
If Size > -1 Then
ReDim BA(Math.Floor(Size / 8))
_Length = Size + 1
End If
End Sub
\'Load a byte array on TBitArray init
Sub New(ByVal Bytes() As Byte)
BA = Bytes
_Length = Bytes.Length * 8
End Sub
\'Load a byte array on TBitArray init
Sub New(ByVal Bytes() As Byte, ByVal Length As Integer)
BA = Bytes
_Length = Length
End Sub
End Class