VB算法分析专用的位运算函数

2025-10-18 20:37:02

1、'逻辑左移

Public Function SHL(ByVal Num As Variant, Optional ByVal iCL As Byte = 1)

    Dim i As Byte

    Dim bMask As Byte, iMask As Integer, lMask As Long

    Select Case VarType(Num)

    Case 2 '16 bits

      For i = 1 To iCL

        iMask = 0

        If (Num And &H4000) <> 0 Then iMask = &H8000

        Num = (Num And &H3FFF) * 2 Or iMask

      Next

    Case 3, 5 '32 bits

      For i = 1 To iCL

        lMask = 0

        If (Num And &H40000000) <> 0 Then lMask = &H80000000

        Num = (Num And &H3FFFFFFF) * 2 Or lMask

      Next

    Case 17 '8 bits

      For i = 1 To iCL

        bMask = 0

        If (Num And &H40) <> 0 Then bMask = &H80

        Num = (Num And &H3F) * 2 Or bMask

      Next

    Case Else

      SHL = False

      Exit Function

    End Select

    SHL = Num

End Function

2、'逻辑右移

Public Function SHR(ByVal Num As Variant, Optional ByVal iCL As Byte = 1)

    Dim i As Byte

    Dim bMask As Byte, iMask As Integer, lMask As Long

    a = VarType(Num)

    Select Case VarType(Num)

    Case 2 '16 bits

      For i = 1 To iCL

        iMask = 0

        If (Num And &H8000) <> 0 Then iMask = &H4000

        Num = (Num And &H7FFF) \ 2 Or iMask

      Next

    Case 3, 5 '32 bits

      For i = 1 To iCL

        lMask = 0

        If (Num And &H80000000) <> 0 Then lMask = &H40000000

        Num = (Num And &H7FFFFFFF) \ 2 Or lMask

      Next

    Case Else

      SHR = False

      Exit Function

    End Select

    SHR = Num

End Function

3、'算术左移

Public Function SAL(ByVal Num As Variant, Optional ByVal iCL As Byte = 1)

    SAL = SHL(Num, iCL)

End Function

4、'算术右移

Public Function SAR(ByVal Num As Variant, Optional ByVal iCL As Byte = 1)

    Dim i As Byte

    Dim bMask As Byte, iMask As Integer, lMask As Long

    a = VarType(Num)

    Select Case VarType(Num)

    Case 2 '16 bits

        For i = 1 To iCL

            iMask = 0

            If (Num And &H8000) <> 0 Then iMask = &HC000

            Num = (Num And &H7FFF) \ 2 Or iMask

        Next

    Case 3, 5 '32 bits

        For i = 1 To iCL

            If (Num And &H80000000) <> 0 Then lMask = &HC0000000

            Num = (Num And &H7FFFFFFF) \ 2 Or lMask

        Next

    Case 17 '8 bits

        For i = 1 To iCL

            If (Num And &H80) <> 0 Then bMask = &HC0

            Num = (Num And &H7F) \ 2 Or bMask

        Next

    Case Else

        SAR = False

        Exit Function

    End Select

    SAR = Num

End Function

5、'循环左移

Public Function ROL(ByVal Num As Variant, Optional ByVal iCL As Byte = 1)

    Dim i As Byte

    Dim bMask As Byte, iMask As Integer, lMask As Long

    a = VarType(Num)

    Select Case VarType(Num)

    Case 2 '16 bits

      For i = 1 To iCL

        iMask = 0

        If (Num And &H4000) <> 0 Then iMask = &H8000

        If (Num And &H8000) <> 0 Then iMask = iMask Or &H1

        Num = (Num And &H3FFF) * 2 Or iMask

      Next

    Case 3, 5 '32 bits

      For i = 1 To iCL

        lMask = 0

        If (Num And &H40000000) <> 0 Then lMask = &H80000000

        If (Num And &H80000000) <> 0 Then lMask = lMask Or &H1

        Num = (Num And &H3FFFFFFF) * 2 Or lMask

      Next

    Case 17 '8 bits

      For i = 1 To iCL

        bMask = 0

        If (Num And &H40) <> 0 Then bMask = &H80

        If (Num And &H80) <> 0 Then bMask = bMask Or &H1

        Num = (Num And &H3F) * 2 Or bMask

      Next

    Case Else

      ROL = False

      Exit Function

    End Select

    ROL = Num

End Function

6、'循环右移

Public Function ROR(ByVal Num As Variant, Optional ByVal iCL As Byte = 1)

    Dim i As Byte

    Dim bMask As Byte, iMask As Integer, lMask As Long

    Select Case VarType(Num)

    Case 2 '16 bits

      For i = 1 To iCL

        iMask = 0

        If (Num And &H8000) <> 0 Then iMask = &H4000

        If (Num And &H1) <> 0 Then iMask = iMask Or &H8000

        Num = (Num And &H7FFF) \ 2 Or iMask

      Next

    Case 3, 5 '32 bits

      For i = 1 To iCL

        lMask = 0

        If (Num And &H80000000) <> 0 Then lMask = &H40000000

        If (Num And &H1) <> 0 Then lMask = lMask Or &H80000000

        Num = (Num And &H7FFFFFFF) \ 2 Or lMask

      Next

    Case 17 '8 bits

      For i = 1 To iCL

        bMask = 0

        If (Num And &H80) <> 0 Then bMask = &H40

        If (Num And &H1) <> 0 Then bMask = bMask Or &H80

        Num = (Num And &H7F) \ 2 Or bMask

      Next

    Case Else

      ROR = False

      Exit Function

    End Select

    ROR = Num

End Function

7、'带进位循环左移

Public Function RCL(ByVal Num As Variant, Optional ByVal iCL As Byte = 1, Optional ByVal iCf As Byte = 0)

    Dim i As Byte, CF As Byte

    Dim bMask As Byte, iMask As Integer, lMask As Long

    CF = iCf

    Select Case VarType(Num)

    Case 2 '16 bits

      For i = 1 To iCL

        If CF = 0 Then

           iMask = 0

        Else

           iMask = 1

        End If

        If (Num And &H4000) <> 0 Then iMask = iMask Or &H8000

        If (Num And &H8000) <> 0 Then

           CF = 1

        Else

           CF = 0

        End If

        Num = (Num And &H3FFF) * 2 Or iMask

      Next

    Case 3, 5 '32 bits

      For i = 1 To iCL

        If CF = 0 Then

           lMask = 0

        Else

           lMask = 1

        End If

        If (Num And &H40000000) <> 0 Then lMask = lMask Or &H80000000

        If (Num And &H80000000) <> 0 Then

           CF = 1

        Else

           CF = 0

        End If

        Num = (Num And &H3FFFFFFF) * 2 Or lMask

      Next

    Case 17 '8 bits

      For i = 1 To iCL

        If CF = 0 Then

           bMask = 0

        Else

           bMask = 1

        End If

        If (Num And &H40) <> 0 Then bMask = bMask Or &H80

        If (Num And &H80) <> 0 Then

           CF = 1

        Else

           CF = 0

        End If

        Num = (Num And &H3F) * 2 Or bMask

      Next

    Case Else

      RCL = False

      Exit Function

    End Select

    RCL = True

End Function

8、'带进位循环右移

Public Function RCR(ByVal Num As Variant, Optional ByVal iCL As Byte = 1, Optional ByVal iCf As Byte = 0)

    Dim i As Byte, CF As Byte

    Dim bMask As Byte, iMask As Integer, lMask As Long

    CF = iCf

    Select Case VarType(Num)

    Case 2 '16 bits

      For i = 1 To iCL

        If CF = 1 Then

           iMask = &H8000

        Else

           iMask = 0

        End If

        If (Num And &H8000) <> 0 Then iMask = iMask Or &H4000

        If (Num And &H1) <> 0 Then

           CF = 1

        Else

           CF = 0

        End If

        Num = (Num And &H7FFF) \ 2 Or iMask

      Next

    Case 3, 5 '32 bits

      For i = 1 To iCL

        If CF = 1 Then

           lMask = &H80000000

        Else

           lMask = 0

        End If

        If (Num And &H80000000) <> 0 Then lMask = lMask Or &H40000000

        If (Num And &H1) <> 0 Then

           CF = 1

        Else

           CF = 0

        End If

        Num = (Num And &H7FFFFFFF) \ 2 Or lMask

      Next

    Case 17 '8 bits

      For i = 1 To iCL

        If CF = 1 Then

           bMask = &H80

        Else

           bMask = 0

        End If

        If (Num And &H80) <> 0 Then bMask = bMask Or &H40

        If (Num And &H1) <> 0 Then

           CF = 1

        Else

           CF = 0

        End If

        Num = (Num And &H7F) \ 2 Or bMask

      Next

    Case Else

      RCR = False

      Exit Function

    End Select

    RCR = Num

End Function

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢