首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >VBA位操作

VBA位操作

作者头像
xyj
发布2020-08-26 23:02:37
1.8K0
发布2020-08-26 23:02:37
举报
文章被收录于专栏:VBA 学习VBA 学习VBA 学习

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

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

右移,需要注意负数的情况:

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
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-08-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 VBA 学习 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档