Bit Masking

  • Thread starter Thread starter Merlyn Knight
  • Start date Start date
M

Merlyn Knight

Is bit masking restricted to long or integer type only?

I created a function that determines when events can happen on
several different days based on what day of the week a month begins
and how many days are in the month.
My idea was to assign each date to a bit and when a date was passed to
the function it would use bit masking to return whether the date was
one of the selected dates.
It works until a month with 31 days because 2^31 is larger than a
long.
I tried to use double type and got the overflow error.
I tried to use the CDec conversion but nothing seems to work.

I've searched Google and Deja and I not found a solution
Thanks for any advice
Merlyn
 
A clarification
If just the 31st was chosen the it works ok. It is when 2^31 plus any
other day is added that it exceeds the long data type.
 
You could use two longs and create your own bitset/clear/test functions.
As a quick example:

Sub test()
Dim HiLong As Long, LoLong As Long
BitSet HiLong, LoLong, 40

Debug.Print BitTest(HiLong, LoLong, 45)
Debug.Print BitTest(HiLong, LoLong, 40)
End Sub

Sub BitSet(HiLong As Long, LoLong As Long, BitNum As Long)
If BitNum >= 0 And BitNum < 64 Then
If BitNum >= 32 Then
HiLong = HiLong Or 2 ^ (BitNum - 32)
Else
LoLong = LoLong Or BitNum
End If
End If
End Sub

Function BitTest(HiLong As Long, LoLong As Long, BitNum As Long) As Boolean
If BitNum >= 0 And BitNum < 64 Then
If BitNum >= 32 Then
BitTest = (HiLong And 2 ^ (BitNum - 32))
Else
BitTest = (LoLong And BitNum)
End If
End If
End Function
 
Back
Top