移位运算符在程序设计中,是位操作运算符的一种。移位运算符可以在二进制的基础上对数字进行平移。按照平移的方向和填充数字的规则分为三种:<<(左移)、>>(带符号右移)和>>>(无符号右移)。
左移运算由两个小于号表示(<<)。
它把数字中的所有数位向左移动指定的数量,高位移出(舍弃),低位的空位补零。例如,把数字 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
发表评论