VBA位操作

2020-08-26 23:02:37 浏览数 (1)

计算机在运行的过程中,所有的数据都是存储在内存中的,内存中的数据都是以二进制存储,也就是只有高电平(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
vba

0 人点赞