移位运算符在程序设计中,是位操作运算符的一种。移位运算符可以在二进制的基础上对数字进行平移。按照平移的方向和填充数字的规则分为三种:<>(带符号右移)和>>>(无符号右移)。
左移运算由两个小于号表示(<
它把数字中的所有数位向左移动指定的数量,高位移出(舍弃),低位的空位补零。例如,把数字 2(等于二进制中的 10)左移 5 位,结果为 64(等于二进制中的 1000000)。
数学意义:
在数字没有溢出的前提下,对于正数和负数,左移一位都相当于乘以2的1次方,左移n位就相当于乘以2的n次方。
有符号右移运算符由两个大于号表示(>>)。
它把 32 位数字中的所有数位整体右移,同时保留该数的符号(正号或负号)。有符号右移运算符恰好与左移运算相反。例如,把 64 右移 5 位,将变为 2。
数学意义:
右移一位相当于除2,右移n位相当于除以2的n次方。
无符号右移运算符由三个大于号(>>>)表示。
它将无符号 32 位数的所有数位整体右移。
如果在vba中仅仅靠数学意义来编写移位运算函数,则经常会陷入“溢出”错误。
由于JavaScript中刚好具有以上三种移位运算符,所以可以在vba中调用JavaScript来编写移位运算函数。
代码如下:
Visual Basic
'左移函数
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
'左移函数
FunctionBitShiftLeft(ByValiAsVariant)
DimsJSAsString
sJS=" var Result = "&i&" << 5"
DimoHtmlAsObject
'定义HtmlDocument对象
SetoHtml=CreateObject("htmlfile")
DimoWindowAsObject
SetoWindow=oHtml.parentWindow
WithoWindow
.execScriptsJS
BitShiftLeft=.Result
EndWith
SetoWindow=Nothing
SetoHtml=Nothing
EndFunction
'右移函数
FunctionBitShiftRight(ByValiAsVariant)
DimsJSAsString
sJS=" var Result = "&i&" >> 5"
DimoHtmlAsObject
'定义HtmlDocument对象
SetoHtml=CreateObject("htmlfile")
DimoWindowAsObject
SetoWindow=oHtml.parentWindow
WithoWindow
.execScriptsJS
BitShiftRight=.Result
EndWith
SetoWindow=Nothing
SetoHtml=Nothing
EndFunction
SubQQ1722187970()
Debug.PrintBitShiftLeft(2)
Debug.PrintBitShiftRight(64)
EndSub
其它相关文章推荐: