本帖最后由 爱疯 于 2012-7-5 21:49 编辑
今天看了爱疯的提问,http://excelpx.com/dispbbs.asp?boardID=5&ID=147264&page=1
终于决定到网上查找资料,用代码验证按位运算的说法.下面是我根据网上资料做的验证And和Or两个逻辑运算符按位运算过程的示例,欢迎补充和指正。
运行Main可以在立即窗口中看到过程和结果。
Option Explicit
' 吕布于2010/11/01 Sub Main() Const POS_A As Integer = 20 Const POS_B As Integer = 65 Dim str1 As String, str2 As String, strTrue As String Dim strResult As String Dim i As Integer
str1 = Hex2Bin(Hex(CLng(3))) ' 00000000000000000000000000000011 str2 = Hex2Bin(Hex(CLng(7))) ' 00000000000000000000000000000111 strTrue = Hex2Bin(Hex(CLng(True))) ' 11111111111111111111111111111111
Debug.Print "说明"; Tab(POS_A), "二进制表示"; Tab(POS_B), "值" Debug.Print "整数3"; Tab(POS_A), str1; Tab(POS_B), 3 Debug.Print "整数7", Tab(POS_A), str2; Tab(POS_B), 7 Debug.Print "逻辑值True"; Tab(POS_A), strTrue; Tab(POS_B), True Debug.Print
' And按位操作 strResult = BitOperation(str1, str2, "AND") ' 3 And 7 Debug.Print "3 And 7"; Tab(POS_A), strResult; Tab(POS_B), Bin2Dec(strResult) strResult = BitOperation(strResult, strTrue, "AND") ' 3 And 7 and True Debug.Print "3 And 7 and True"; Tab(POS_A), strResult; Tab(POS_B), Bin2Dec(strResult) Debug.Print
' Or按位操作 strResult = BitOperation(str1, str2, "OR") ' 3 Or 7 Debug.Print "3 Or 7"; Tab(POS_A), strResult; Tab(POS_B), Bin2Dec(strResult) strResult = BitOperation(strResult, strTrue, "OR") ' 3 Or 7 Or True Debug.Print "3 Or 7 Or True"; Tab(POS_A), strResult; Tab(POS_B), Bin2Dec(strResult) End Sub
Function BitOperation(binArg1 As String, binArg2 As String, Operation As String) As String ' 把两位二进制字符串逐位进行AND运算,32位 Dim i As Integer Dim str1 As String, str2 As String Dim sResult As String
str1 = Right(String(32, "0") & binArg1, 32) str2 = Right(String(32, "0") & binArg2, 32)
For i = 1 To 32 If UCase(Operation) = "AND" Then sResult = sResult & (Mid(str1, i, 1) And Mid(str2, i, 1)) ElseIf UCase(Operation) = "OR" Then sResult = sResult & (Mid(str1, i, 1) Or Mid(str2, i, 1)) End If Next i BitOperation = sResult End Function
Function Hex2Bin(ByVal Hex As String) As String ' 十六进制转换为二进制,32位 Dim i As Long Dim B As String Hex = UCase(Hex) For i = 1 To Len(Hex) Select Case Mid(Hex, i, 1) Case "0": B = B & "0000" Case "1": B = B & "0001" Case "2": B = B & "0010" Case "3": B = B & "0011" Case "4": B = B & "0100" Case "5": B = B & "0101" Case "6": B = B & "0110" Case "7": B = B & "0111" Case "8": B = B & "1000" Case "9": B = B & "1001" Case "A": B = B & "1010" Case "B": B = B & "1011" Case "C": B = B & "1100" Case "D": B = B & "1101" Case "E": B = B & "1110" Case "F": B = B & "1111" End Select Next i While Left(B, 1) = "0" B = Right(B, Len(B) - 1) Wend Hex2Bin = Right(String(32, "0") & B, 32) End Function
Function Bin2Dec(ByVal Bin As String) As Long ' 二进制数转换为十进制数,32位 Dim i As Long Dim sTmp As String Dim bSign As Boolean Dim lTmp As Long
sTmp = Right(String(32, "0") & Bin, 32) ' 如果是负数(首位为1)先取反 If Left(sTmp, 1) = "1" Then bSign = True ' 取反 For i = 1 To 32 If Mid(sTmp, i, 1) = "1" Then Mid(sTmp, i, 1) = "0" Else Mid(sTmp, i, 1) = "1" Next i End If
' 正数转换为十进制 For i = 1 To 32 lTmp = lTmp * 2 + Val(Mid(sTmp, i, 1)) Next i ' 如果是负数先加上负号再减1 If bSign Then Bin2Dec = -lTmp - 1 Else Bin2Dec = lTmp End Function
BdsbBpGp.rar
(13.66 KB, 下载次数: 29)
|