You've probably seen several of these, but this one avoids the performance trap of using exponentiation. As far as I know it works without quirks or bugs:
Code:
Option Explicit
Function Bits2Long(ByVal Bits As String) As Long
Dim L As Long, Bits32 As Long, I As Long
L = Len(Bits)
If 1 > L Or L > 32 Or Bits Like "*[!01]*" Then Err.Raise 5
If L = 32 Then Bits32 = 1
For I = Bits32 + 1 To L
Bits2Long = 2 * Bits2Long + (AscW(Mid$(Bits, I, 1)) - 48)
Next
If Bits32 And AscW(Bits) = 49 Then Bits2Long = Bits2Long Or &H80000000
End Function
Function Bits2LongV2(ByVal Bits As String) As Long
'Stripped down, no error checking, only 1- to 31-bit argument:
Dim I As Long
For I = 1 To Len(Bits)
Bits2LongV2 = 2 * Bits2LongV2 + (AscW(Mid$(Bits, I, 1)) - 48)
Next
End Function
Private Sub Try(ByVal Bits As String)
On Error Resume Next
Print Hex$(Bits2Long(Bits)); Tab(16); Bits2Long(Bits); Tab(32); Bits
If Err Then
Print "Invalid parameter:"; Tab(32); Bits
End If
End Sub
Private Sub Try2(ByVal Bits As String)
Print Hex$(Bits2LongV2(Bits)); Tab(16); Bits2LongV2(Bits); Tab(32); Bits
End Sub
Private Sub Form_Load()
AutoRedraw = True
Try "11111111111111111111111111111111"
Try "01111111111111111111111111111111"
Try "0"
Try "2"
Try ""
Try "111111111111111111111111111111111"
Try "10101010"
Try2 "10101010"
End Sub