如何在vba中编写左右移位运算函数?

移位运算符在程序设计中,是位操作运算符的一种。移位运算符可以在二进制的基础上对数字进行平移。按照平移的方向和填充数字的规则分为三种:<<(左移)、>>(带符号右移)和>>>(无符号右移)。

左移运算由两个小于号表示(<<)。

它把数字中的所有数位向左移动指定的数量,高位移出(舍弃),低位的空位补零。例如,把数字 2(等于二进制中的 10)左移 5 位,结果为 64(等于二进制中的 1000000)。

数学意义:

在数字没有溢出的前提下,对于正数和负数,左移一位都相当于乘以2的1次方,左移n位就相当于乘以2的n次方。

有符号右移运算符由两个大于号表示(>>)

它把 32 位数字中的所有数位整体右移,同时保留该数的符号(正号或负号)。有符号右移运算符恰好与左移运算相反。例如,把 64 右移 5 位,将变为 2。

数学意义:

右移一位相当于除2,右移n位相当于除以2的n次方。

无符号右移运算符由三个大于号(>>>)表示。

它将无符号 32 位数的所有数位整体右移。

如果在vba中仅仅靠数学意义来编写移位运算函数,则经常会陷入“溢出”错误。

由于JavaScript中刚好具有以上三种移位运算符,所以可以在vba中调用JavaScript来编写移位运算函数。

代码如下:

'左移函数
Function BitShiftLeft(ByVal i As Variant)
    Dim sJS As String
    sJS = " var Result = " & i & " << 5"
    Dim oHtml As Object
    '定义HtmlDocument对象
    Set oHtml = CreateObject("htmlfile")
    Dim oWindow As Object
    Set oWindow = oHtml.parentWindow
    With oWindow
        .execScript sJS
      BitShiftLeft = .Result
    End With
    Set oWindow = Nothing
    Set oHtml = Nothing
End Function
'右移函数
Function BitShiftRight(ByVal i As Variant)
    Dim sJS As String
    sJS = " var Result = " & i & " >> 5"
    Dim oHtml As Object
    '定义HtmlDocument对象
    Set oHtml = CreateObject("htmlfile")
    Dim oWindow As Object
    Set oWindow = oHtml.parentWindow
    With oWindow
        .execScript sJS
      BitShiftRight = .Result
    End With
    Set oWindow = Nothing
    Set oHtml = Nothing
End Function
Sub QQ1722187970()
    Debug.Print BitShiftLeft(2)
    Debug.Print BitShiftRight(64)
End Sub

 

       

发表评论