excel二进制移位运算_如何在vba中实现二进制的取位操作?

本文介绍了如何在VBA中实现二进制移位运算,通过自定义GetBit函数来获取指定二进制位的值。利用位运算符AND,结合2的幂次,可以提取出二进制数的任意一位。通过示例代码展示了获取数字-1的二进制表示形式,结果为全1,揭示了VBA中True等于-1的原理。
摘要由CSDN通过智能技术生成

我们知道数据在计算机内存中都是以二进制形式存储的。

在内存中一般是以字节为单位存储数据,一个字节有8个位(bit)。

比如数字3如果以一个字节来存储 ,在内存以二进制表示是”0000 0011″,这时候从右到左,分别称为从第1位到第8位。

现在假如想取第1位的值,可以使用AND运算符 把要取的值与1做位比较运算。

因为1的二进制形式是“0000 0001”,所以如果用任何一个二进制与1做AND比较,其余位的值都将变为0,只剩下第一位,假如被比较的值的第一位是0,将返回0,第一位是1将返回1,通过返回的十进制值可以直接得出被比较的值的第一位是0还是1。

按照这个思路,假如要取二进制中第二位的值,只需要把第二位与1比较,其它位全部与0比较。假如返回的值时0,则第二位为0,返回的值非0,则第二位的值时为1。能满足第二位为1,其它位都为0的十进制值是2,因为2的二进制表示形式是“0000 0010”。

依次类推,假如要取第三位的值,只需要与十进制值4(二进制形式“0000 0100”)比较,要取第四位的值,只需要与十进制值8(二进制形式“0000 1000”)比较,要取第N位的值,只需要与十进制值2的N-1次幂比较即可,返回的十进制结果如果是0,表示第N位是0,如果非0,表示第N位是1。

根据以上的原理分析,可以在VBA中自定义如下的取二进制位的取位函数。

Visual Basic

Public Function GetBit(ByVal i As Long, ByVal n As Byte) As Boolean

GetBit = i And 2 ^ (n - 1)

End Function

1

2

3

PublicFunctionGetBit(ByValiAsLong,ByValnAsByte)AsBoolean

GetBit=iAnd2^(n-1)

EndFunction

其中参数i为要取二进制位的值的十进制值,参数n为要取的二进制位,n最小是1,也就是从第1位开始取。

GetBit函数的返回值如果是True,则表示该位为1,如果是False,则表示该位为0。

有了以上的取位函数,我们可以利用这个函数清晰地了解数值在内存中的存储形式。

比如想要获取数字-1在内存中的二进制表示形式,可以使用如下的代码:

Visual Basic

Sub QQ1722187970()

Dim i As Byte

Dim j As Integer

j = -1

Dim arr(1 To 16)

For i = 1 To 16

arr(17 - i) = 1 * Abs(GetBit(j, i))

Next i

'获取变量j的二进制表示形式

Debug.Print Join(arr, "")

End Sub

1

2

3

4

5

6

7

8

9

10

11

SubQQ1722187970()

DimiAsByte

DimjAsInteger

j=-1

Dimarr(1To16)

Fori=1To16

arr(17-i)=1*Abs(GetBit(j,i))

Nexti

'获取变量j的二进制表示形式

Debug.PrintJoin(arr,"")

EndSub

结果为“1111111111111111”,细心的你会发现这个二进制正好是0的二进制的取反,这也是为什么在vba中True=-1,而不是1了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值