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

 :2026-02-20 21:06    点击:18  

在数字信号处理、嵌入式系统开发及数据加密等领域,二进制位的操作是基础且关键的技术,MATLAB作为强大的科学计算软件,提供了丰富的位操作函数,其中bitsetbitget是实现对指定位进行“置位”与“取位”的核心工具,本文将详细介绍这两个函数的语法、功能及应用场景,帮助读者掌握MATLAB中的位操作技巧。

认识位操作:二进制世界的基础

位操作是直接对整数在内存中的二进制位进行修改或提取的操作,将一个8位二进制数的第3位设置为1,或获取其第5位的值,这类操作在底层硬件控制、数据压缩、权限校验等场景中广泛应用,MATLAB通过bitsetbitgetbitshift等一系列函数,为用户提供了便捷的位操作接口,无需深入底层汇编即可高效完成二进制位处理。

bitget函数:提取指定位的值

bitget函数用于从指定整数中提取某一位的值(0或1),其语法简洁直观,是获取二进制位信息的核心工具。

函数语法

b = bitget(A, bit)
  • A:输入数值,可以是标量、向量、矩阵或多维数组,数据类型支持整数(如uint8int16uint32等)或逻辑类型;
  • bit:要提取的位的位置,最低位(最右边)为第1位,向左依次递增(如第2位、第3位……);
  • b:返回值,与A同形状的数组,元素为提取的位值(0或1),数据类型为doublelogical(取决于bit参数的类型)。

功能详解

bitget的本质是根据bit指定的位置,计算“掩码”(mask)并与输入值进行按位与操作,最终提取该位的值,提取A的第3位时,掩码为二进制..0100(即2^(3-1)=4),A & mask的结果若为0,则该位为0;若为mask,则该位为1。

应用示例

示例1:提取标量指定位的值

A = 13; % 二进制:1101(第1位1,第2位0,第3位1,第4位1)
b1 = bitget(A, 1); % 提取第1位(最低位),结果:1
b3 = bitget(A, 3); % 提取第3位,结果:1
b5 = bitget(A, 5); % 提取第5位(超出实际位数,结果:0)
disp(['第1位: ', num2str(b1), ', 第3位: ', num2str(b3), ', 第5位: ', num2str(b5)]);

输出:

第1位: 1, 第3位: 1, 第5位: 0

示例2:批量提取向量/矩阵的指定位

A = [1, 5, 9; 13, 7, 2]; % 各元素二进制:1(0001), 5(0101), 9(1001); 13(1101), 7(0111), 2(0010)
b = bitget(A, 4); % 提取所有元素的第4位
disp('第4位的值:');
disp(b);

输出:

第4位的值:
     0     0     1
     1     0     0

示例3:处理不同数据类型

A = uint8(255); % 8位无符号整数,二进制:11111111
b_logical = bitget(A, 1:8, 'logical'); % 以逻辑类型返回所有位
disp('逻辑类型的位值:');
disp(b_logical);

输出:

逻辑类型的位值:
  1×8 logical 数组
   1   1   1   1   1   1   1   1

bitset函数:设置指定位的值

bitset函数用于将指定整数中的某一位设置为给定的值(0或1),其语法灵活,支持“置1”和“清0”两种操作,是修改二进制位的关键工具。

函数语法

C = bitset(A, bit)
C = bitset(A, bit, v)
  • A:输入数值,数据类型与bitget一致,支持整数或逻辑类型;
  • bit:要设置的位的位置,最低位为第1位;
  • v:可选参数,指定期望设置的位值,只能是01;若省略v,则默认将该位置为1;
  • C:返回值,与A同形状的数组,数据类型与A一致,指定位已被修改。

功能详解

bitset通过“按位或”和“按位与非”操作实现置位和清0:

  • 置1(省略vv=1):构造掩码2^(bit-1),执行A | mask,将目标位强制为1,其他位不变;
  • 清0v=0):构造掩码~(2^(bit-1)),执行A & mask,将目标位强制为0,其他位不变。

应用示例

示例1:指定位置1(默认)

A = 10; % 二进制:1010(第1位0,第2位1,第3位0,第4位1)
C = bitset(A, 3); % 将第3位置1,变为1010 | 0100 = 1110(14)
disp(['修改后的值: ', num2str(C), '(二进制: ', dec2bin(C, 4), ')']);

输出:

修改后的值: 14(二进制: 1110)

示例2:指定位清0(v=0)

A = 14; % 二进制:1110
C = bitset(A, 2, 0); % 将第2位置0,变为1110 & 1101 = 1100(12)
disp(['修改后的值: ', num2str(C), '(二进制: ', dec2bin(C, 4), ')']);

输出:

修改后的值: 12(二进制: 1100)

示例3:批量修改矩阵的指定
随机配图

A = [1, 3; 5, 7]; % 二进制:1(0001), 3(0011); 5(0101), 7(0111)
C = bitset(A, 3, 1); % 将所有元素的第3位置1
disp('修改后的矩阵:');
disp(C);
disp('二进制形式:');
disp(dec2bin(C, 4));

输出:

修改后的矩阵:
     5     7
     5     7
二进制形式:
    0101
    0111
    0101
    0111

bitset与bitget的协同应用

在实际应用中,bitsetbitget常常需要配合使用,实现对二进制位的“读取-修改-写入”操作,提取某一位的值后进行判断,再根据判断结果修改该位。

应用案例:数据校验位生成与校验

假设我们需要一个简单的奇偶校验位:确保数据字节(8位)中“1”的个数为偶数,校验位通常放在最高位(第8位),其值由低7位决定。

生成校验位

data = 0b1101011; % 7位数据,十进制:107
% 提取低7位的值
low7_bits = bitget(data, 1:7);
% 计算低7位中“1”的个数
count_ones = sum(low7_bits);
% 校验位=“1”的个数取反(偶数个1则校验位为0,奇数个则为1)
parity_bit = 1 - mod(count_ones, 2);
% 将校验位设置到第8位
data_with_parity = bitset(uint8(data), 8, parity_bit);
disp

本文由用户投稿上传,若侵权请提供版权资料并联系删除!