MATLAB中bitset与bitget函数,位操作的艺术
在计算机底层开发与数据处理中,位操作(Bitwise Operation)是一项基础且强大的技术,它允许直接对数据的二进制位进行修改、提取和判断,MATLAB作为广泛应用于科学计算、工程仿真和算法开发的工具,提供了丰富的位操作函数,其中bitset和bitget是两个核心工具,分别用于设置(修改)指定位的值和获取指定位的值,本文将详细介绍这两个函数的语法、功能、使用场景及代码示例,帮助读者掌握MATLAB中的位操作技巧。
bitget函数:获取指定位的值
函数语法与功能
bitget是MATLAB中用于提取整数或数组中某一位二进制值的函数,其基本语法为:
b = bitget(A, bit)
A:输入参数,可以是标量、向量、矩阵或多维数组,数据类型为uint(无符号整数,如uint8、uint16等)或int(有符号整数,如int8、int32等)。bit:指定位的位置,从1开始计数(最低位为第1位,次低位为第2位,依此类推)。b:返回值,与A同形状的数组,元素为指定位的二进制值(0或1)。
使用示例
示例1:提取标量指定位的值
假设我们有一个8位无符号整数A = 13,其二进制表示为00001101(从低位到高位为第1到第8位),提取第2位和第5位的值:
A = uint8(13); % 二进制: 00001101 b2 = bitget(A, 2); % 提取第2位(从右数第2位,值为0) b5 = bitget(A, 5); % 提取第5位(从右数第5位,值为1) disp(['第2位值: ', num2str(b2)]); % 输出: 第2位值: 0 disp(['第5位值: ', num2str(b5)]); % 输出: 第5位值: 1
示例2:提取数组中所有元素的指定位
定义一个无符号整数数组A = [1, 2, 5, 9],提取每个数的第3位:
A = uint8([1, 2, 5, 9]); % 二进制: 00000001, 00000010, 00000101, 00001001 b3 = bitget(A, 3); % 提取第3位 disp(b3); % 输出: [0, 0, 1, 0](对应1的第3位0,2的第3位0,5的第3位1,9的第3位0)
示例3:提取多维数组的指定位
创建一个2x3的uint8矩阵,提取所有元素的第1位(最低位):
A = uint8([1, 2, 3; 4, 5, 6]); % 二进制: 00000001, 00000010, 00000011; 00000100, 00000101, 00000110 b1 = bitget(A, 1); % 提取第1位 disp(b1); % 输出: % 1 0 1 % 0 1 0
注意事项
bit参数必须为正整数,且不能超过输入数据类型的最大位数(如uint8的最大位数为8,uint16为16)。- 若
A为有符号整数(如int8),bitget会将其视为二进制补码形式处理,但位的位置仍从1开始计数(符号位为最高位,如int8的第8位)。
bitset函数:设置指定位的值
函数语法与功能
bitset用于修改整数或数组中某一位的二进制值,语法如下:
C = bitset(A, bit, val)
A:输入参数,数据类型同bitget(uint或int)。bit:要设置的位置(从1开始计数)。val:设置的值,只能是0或1。C:返回值,与A同形状的数组,指定位的值被修改为val,其他位保持不变。
若省略val,则默认将指定位设置为1:
C = bitset(A, bit) % 等价于 bitset(A, bit, 1)
使用示例
示例1:设置标量指定位的值
将uint8类型的A = 13(00001101)的第2位设置为1:
A = uint8(13); C = bitset(A, 2, 1); % 第2位从0变为1,二进制变为00001111(15) disp(['修改后的值: ', num2str(C)]); % 输出: 修改后的值: 15
示例2:省略val参数(默认设置为1)
将A = 10(00001010)的第4位设置为1(默认值):
A = uint8(10); C = bitset(A, 4); % 第4位从0变为1,二进制变为00001110(14) disp(C); % 输出: 14
示例3:批量修改数组中的指定位
定义数组A = [1, 2, 3, 4],将每个数的第1位设置为0:
A = uint8([1, 2, 3,4]); % 二进制: 00000001, 00000010, 00000011, 00000100 C = bitset(A, 1, 0); % 第1位置0 disp(C); % 输出: [0, 2, 2, 4](1的第1位1→0→0;2的第1位0→0;3的第1位1→0→2;4的第1位0→0)
示例4:处理多维数组
创建2x2矩阵A = [5, 6; 7, 8],将所有元素的第3位设置为1:
A = uint8([5, 6; 7, 8]); % 二进制: 00000101, 00000110; 00000111, 00001000 C = bitset(A, 3, 1); % 第3位置1 disp(C); % 输出: % 7 7 % 7 8 % (5的第3位0→1→7;6的第3位0→1→7;7的第3位1→1→7;8的第3位0→1→9?此处需注意:8的二进制为00001000,第3位是0,置1后变为00001100,即12,示例结果有误,正确输出应为[7,7;7,12]) % 修正说明:8的二进制00001000,第3位(从右数第3位)是0,置1后变为00001100(12),因此正确输出为: % 7 7 % 7 12
注意事项
val必须是0或1,否则MATLAB会报错。- 若设置的位超出数据类型的最大位数(如对
uint8设置第9位),bitset会自动扩展数据类型(如uint8扩展为uint16),并填充高位为0。
bitset与bitget的联合应用:位数据的修改与验证
在实际应用中,bitset和bitget常配合使用,实现对指定位的“修改-验证”流程,在嵌入式系统开发中,可能需要修改某个控制寄存器的某一位,并确认修改是否成功。
示例:模拟寄存器位操作
假设有一个8位寄存器reg,初始值为0b00001100(12),要求:
- 将第2位设置为1;
- 验证第2位是否为1;
- 将第5位设置为0;
- 验证第5位是否为0。
% 初始化寄存器 reg = uint8(12); % 二
上一篇: 币安交易所收款方式全解析,安全/高效接收数字资产指南
下一篇: AMM,重塑未来城市交通的智慧引擎
