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

 时间:2026-02-12 06:13:32

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

  • 基于网络环境下的CRM功能及其特性
  • 唱鸭怎么输入房号
  • word2007多页文档怎么倒序打印页面?
  • NiceLabel文本自动换行怎样设置?
  • 坚果手机的五个隐藏技巧
  • 热门搜索
    橄榄菜的做法 古老肉的做法 油茶面的做法 晋怎么读 逄怎么读 卵巢早衰怎么办还能调整回来吗 微信聊天记录删除了怎么恢复 拂怎么组词 苹果的做法 合并单元格怎么弄