VBA位操作
时间:2022-07-24
本文章向大家介绍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
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- [869]pandas的dataFrame的行列索引操作
- JSP的文件上传处理
- 将SAP CRM WebClient UI的表格导出成PDF
- java.lang.ClassNotFoundException org.w3c.dom.ElementTraversal
- docker一键部署SpringBoot项目
- 【Flutter 专题】95 图解 Dart 单线程实现异步处理之 Task Queue
- 首发基于OpenPAI细化部署 Hadoop 集群
- PhpStorm 集成 WSL 虚拟机中的 PHP 进行单元测试和代码调试
- 【CMake教程】(五)CMake 配置install打包
- 【CMake教程】(四)CMake 配置生成lib或者so的库文件
- 使用 GitHub README profile 展示更多信息
- 算法工程师-SQL进阶:集合之间的较量
- 算法工程师-SQL进阶:神奇的自连接与子查询
- 算法工程师-SQL进阶:温柔的陷阱-NULL
- SpringBoot 异步任务处理