ExcelBanter

ExcelBanter (https://www.excelbanter.com/)
-   Excel Programming (https://www.excelbanter.com/excel-programming/)
-   -   Bit Masking (https://www.excelbanter.com/excel-programming/293515-bit-masking.html)

Merlyn Knight

Bit Masking
 
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


Merlyn Knight

Bit Masking
 
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.
On Thu, 04 Mar 2004 18:53:19 -0700, Merlyn Knight
wrote:

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



Rob van Gelder[_4_]

Bit Masking
 
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


--
Rob van Gelder - http://www.vangelder.co.nz/excel


"Merlyn Knight" wrote in message
...
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.
On Thu, 04 Mar 2004 18:53:19 -0700, Merlyn Knight
wrote:

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






All times are GMT +1. The time now is 07:27 AM.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
ExcelBanter.com