excel二进制移位运算_如何在vba中编写左右移位运算函数?

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

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

它把数字中的所有数位向左移动指定的数量,高位移出(舍弃),低位的空位补零。例如,把数字 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

其它相关文章推荐:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值