计算机在运行的过程中,所有的数据都是存储在内存中的,内存中的数据都是以二进制存储,也就是只有高电平(1)、低电平(0),而0和1其实只是为了让人方便理解。
计算机规定1个二进制叫做位bit,8个bit叫做Byte,在VBA中,能操作的最小单元就是Byte。
可是很多时候,为了节约空间,很多程序都是利用bit位来代表某些信息的,比如ZIP压缩后的数据。
在VBA中,位操作符主要有
- And 运算符
- Eqv 运算符
- Imp 运算符
- Not 运算符
- Or 运算符
- Xor 运算符
这些操作符一般都用在IF语句的条件判断上,And和Or用的是最多的,这种用法比较好理解,这里就不去讲了。
主要讲讲位操作,很多语言都有移位的操作,但是VBA却没有,不过可以利用位操作符来实现移位函数。
首先需要明白,作为一个整数,左移和右移造成了什么改变。
01
左移
可以先拿10进制的数字来说,比如数字126,左移:
- 左移1位,变成了1260,也就是乘以了10
- 左移2位,变成了12600,也就是乘以了100
- 左移3位,变成了126000,也就是乘以了1000
规律很明显,就是数字本身乘以10的n次方。
02
右移
右移:
- 右移1位,变成了12,也就是除以了10,再向下取整
- 右移2位,变成了1,也就是除以了100,再向下取整
- 右移3位,变成了0,也就是除以了1000,再向下取整
规律很明显,就是数字本身除以10的n次方后向下取整。
如果换成了二进制的话,那么就是乘以或者除以2的n次方。
03
代码实现
左移,需要注意乘2的时候是否会溢出:
代码语言:javascript复制Function BitMoveLeft(ByRef V As Long, num As Long) As Long
Dim i As Long
Dim flag As Boolean '是否要把第32位转换为1
For i = 1 To num
'判断第31位是否=1
If V >= &H40000000 Then
flag = True
'把第31位置换为0
V = V And &H3FFFFFFF
Else
flag = False
End If
V = V * 2
Next
If flag Then
V = V Or &H80000000
End If
BitMoveLeft = V
End Function
右移,需要注意负数的情况:
代码语言:javascript复制Function BitMoveRight(ByRef l As Long, num As Long) As Long
Dim iStart As Long
iStart = 1
If l < 0 Then
'第32位置换为0
l = l And &H7FFFFFFF
l = l 2
'第31位置换为1
l = l Or &H40000000
iStart = 2
End If
Dim i As Long
For i = iStart To num
l = l 2
Next
BitMoveRight = l
End Function