Private Function BIN2DEC(ByVal varString As String) Dim SLen As Long, I As Long, returnNum As Long SLen = Len(varString) For I = 0 To SLen - 1 returnNum = returnNum + Val(Mid(varString, I + 1, 1)) * (2 ^ (SLen - I - 1)) Next BIN2DEC = returnNum End FunctionDebug.Print BIN2DEC("11000") Or BIN2DEC("01100")
'可以用分开按位运算的办法Private Function BinOR(ByVal var1 As String, var2 As String) As String Dim i& For i = 1 To IIf(Len(var1) > Len(var2), Len(var1), Len(var2)) BinOR = BinOR & IIf(i > Len(var1), 0, Mid(var1, i, 1)) Or IIf(i > Len(var2), 0, Mid(var2, i, 1)) Next End FunctionDebug.Print BinOR("11000", "01100")
都是把二进制绕到十进制,再绕回来处理VB调用汇编语言 Public Function Dec2Bin(ByVal Dec As Byte) As Byte() On Error Resume Next Dim Asm(7) As Long Dim Output(7) As Byte Asm(0) = &H5A59585E Asm(1) = &H8A36565B Asm(2) = &H8AF63300 Asm(3) = &H7EAC0D0 Asm(4) = &H8836E0D0 Asm(5) = &H83463114 Asm(6) = &HEF7508FE Asm(7) = &H909090C3 CallWindowProc VarPtr(Asm(0)), VarPtr(Dec), VarPtr(Output(0)), 0, 0 Dec2Bin = Output End Function
楼上的汇编代码很巧妙, 但并没有按照ms的要求保存ebx esi edi的值。 虽然callwindowsproc的内部实现并没有用到这个值, 但以后版本的windows不能保证不出问题.
修改如下Public Function Dec2Bin(ByVal Dec As Byte) As Byte() On Error Resume Next Dim Asm(9) As Long Dim Output(7) As Byte Asm(0) = &H56EC8B55 Asm(1) = &H8B08458B Asm(2) = &H8A360C4D Asm(3) = &H8AF63300 Asm(4) = &H7EAC0D0 Asm(5) = &H8836E0D0 Asm(6) = &H83463114 Asm(7) = &HEF7508FE Asm(8) = &H5DE58B5E Asm(9) = &H900010C2 CallWindowProc VarPtr(Asm(0)), VarPtr(Dec), VarPtr(Output(0)), 0, 0 Dec2Bin = Output End Function
Dim SLen As Long, I As Long, returnNum As Long
SLen = Len(varString)
For I = 0 To SLen - 1
returnNum = returnNum + Val(Mid(varString, I + 1, 1)) * (2 ^ (SLen - I - 1))
Next
BIN2DEC = returnNum
End FunctionDebug.Print BIN2DEC("11000") Or BIN2DEC("01100")
Dim i&
For i = 1 To IIf(Len(var1) > Len(var2), Len(var1), Len(var2))
BinOR = BinOR & IIf(i > Len(var1), 0, Mid(var1, i, 1)) Or IIf(i > Len(var2), 0, Mid(var2, i, 1))
Next
End FunctionDebug.Print BinOR("11000", "01100")
Public Function Dec2Bin(ByVal Dec As Byte) As Byte()
On Error Resume Next
Dim Asm(7) As Long
Dim Output(7) As Byte
Asm(0) = &H5A59585E
Asm(1) = &H8A36565B
Asm(2) = &H8AF63300
Asm(3) = &H7EAC0D0
Asm(4) = &H8836E0D0
Asm(5) = &H83463114
Asm(6) = &HEF7508FE
Asm(7) = &H909090C3
CallWindowProc VarPtr(Asm(0)), VarPtr(Dec), VarPtr(Output(0)), 0, 0
Dec2Bin = Output
End Function
虽然callwindowsproc的内部实现并没有用到这个值, 但以后版本的windows不能保证不出问题.
On Error Resume Next
Dim Asm(9) As Long
Dim Output(7) As Byte
Asm(0) = &H56EC8B55
Asm(1) = &H8B08458B
Asm(2) = &H8A360C4D
Asm(3) = &H8AF63300
Asm(4) = &H7EAC0D0
Asm(5) = &H8836E0D0
Asm(6) = &H83463114
Asm(7) = &HEF7508FE
Asm(8) = &H5DE58B5E
Asm(9) = &H900010C2
CallWindowProc VarPtr(Asm(0)), VarPtr(Dec), VarPtr(Output(0)), 0, 0
Dec2Bin = Output
End Function