MATLAB中bitset与bitget函数,位操作的艺术

时间: 2026-02-21 6:18 阅读数: 1人阅读

在计算机底层开发与数据处理中,位操作(Bitwise Operation)是一项基础且强大的技术,它允许直接对数据的二进制位进行修改、提取和判断,MATLAB作为广泛应用于科学计算、工程仿真和算法开发的工具,提供了丰富的位操作函数,其中bitsetbitget是两个核心工具,分别用于设置(修改)指定位的值和获取指定位的值,本文将详细介绍这两个函数的语法、功能、使用场景及代码示例,帮助读者掌握MATLAB中的位操作技巧。

bitget函数:获取指定位的值

函数语法与功能

bitget是MATLAB中用于提取整数或数组中某一位二进制值的函数,其基本语法为:

b = bitget(A, bit)
  • A:输入参数,可以是标量、向量、矩阵或多维数组,数据类型为uint(无符号整数,如uint8uint16等)或int(有符号整数,如int8int32等)。
  • 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:输入参数,数据类型同bitgetuintint)。
  • bit:要设置的位置(从1开始计数)。
  • val:设置的值,只能是0或1。
  • C:返回值,与A同形状的数组,指定位的值被修改为val,其他位保持不变。

若省略val,则默认将指定位设置为1:

C = bitset(A, bit) % 等价于 bitset(A, bit, 1)

使用示例

示例1:设置标量指定位的值

uint8类型的A = 1300001101)的第2位设置为1:

A = uint8(13);
C = bitset(A, 2, 1); % 第2位从0变为1,二进制变为00001111(15)
disp(['修改后的值: ', num2str(C)]); % 输出: 修改后的值: 15

示例2:省略val参数(默认设置为1)

A = 1000001010)的第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的联合应用:位数据的修改与验证

在实际应用中,bitsetbitget常配合使用,实现对指定位的“修改-验证”流程,在嵌入式系统开发中,可能需要修改某个控制寄存器的某一位,并确认修改是否成功。

示例:模拟寄存器位操作

假设有一个8位寄存器reg,初始值为0b00001100(12),要求:

  1. 将第2位设置为1;
  2. 验证第2位是否为1;
  3. 将第5位设置为0;
  4. 验证第5位是否为0。
% 初始化寄存器
reg = uint8(12); % 二