在计算机科学、数字信号处理、嵌入式系统开发以及数据压缩等领域,二进制位(bit)级别的操作是一项基础且重要的技能,MATLAB作为一种强大的科学计算与工程仿真软件,提供了丰富的函数来支持这些底层操作。bitset和bitget函数便是专门用于设置(置位)和获取二进制位值的利器,本文将详细介绍这两个函数的用法、语法、实例及其在实际应用中的价值。
理解二进制位操作的重要性
在处理数据时,我们有时并不需要关心整个数值的大小,而是关注其中特定位的状态(0或1)。
- 硬件寄存器控制:通过修改特定硬件寄存器的某一位来控制设备功能。
- 状态标志:用一个整数的不同位来表示多种不同的状态或选项。
- 数据压缩与编码:在某些压缩算法或编码方案中,数据以位为单位进行存储和传输。
- 图像处理:某些简单的图像处理操作可能涉及到像素值的二进制位修改。
MATLAB的bitset和bitget函数使得这些操作变得简洁高效。
bitget函数:获取指定位的值
bitget函数用于从一个整数数组中提取指定位的值(0或1)。
语法:
c = bitget(A, bit)
参数说明:
A:输入的整数数组,可以是标量、向量、矩阵或多维数组,数据类型可以是uint8,uint16,uint32,uint64,int8,int16,int32,int64,single, 或double(对于double,会先转换为整数)。bit:要获取的位的位置,位的位置从1开始,从最低有效位(LSB,最右边)数起。bit 1是最低位,bit 8是8位数的最高位(对于uint8)。
返回值:
c:返回一个与A大小相同的数组,其中包含A中对应位置的指定位的值(0或1)。c的数据类型为logical。
示例:
% 定义一个8位无符号整数
A = uint8(23); % 二进制表示为 00010111
% 获取第1位(最低位)
bit1 = bitget(A, 1); % 结果为 1 (true)
% 获取第3位
bit3 = bitget(A, 3); % 结果为 1 (true)
% 获取第5位
bit5 = bitget(A, 5); % 结果为 0 (false)
% 获取第8位(最高位)
bit8 = bitget(A, 8); % 结果为 0 (false)
disp(['A = ', dec2bin(A)]);
disp(['Bit 1: ', num2str(bit1)]);
disp(['Bit 3: ', num2str(bit3)]);
disp(['Bit 5: ', num2str(bit5)]);
disp(['Bit 8: ', num2str(bit8)]);
% 对矩阵操作
B = [uint8(10), uint8(20); uint8(30), uint8(40)]; % 1010, 10100, 11110, 101000
bits_matrix = bitget(B, 4); % 获取每个数的第4位
disp('Matrix B''s 4th bit:');
disp(bits_matrix); % 结果为 [0, 1; 1, 0] (因为10(1010)的第4位是0, 20(10100)的第4位是1, ...)
bitset函数:设置指定位的值
bitset函数用于将一个整数数组中的指定位设置为给定的值(0或1)。
语法:
C = bitset(A, bit) C = bitset(A, bit, v)
参数说明:
A:输入的整数数组,数据类型同bitget。bit:要设置的位的位置,从1开始计数。v(可选):要设置的位值,可以是0或1,如果省略v,则默认将该位设置为1(置位)。
返回值:
C:返回一个新的数组,其中A的指定位被设置为v(或1)。C的数据类型通常与A相同。
示例:
% 定义一个8位无符号整数 A = uint8(23); % 二进制 00010111 % 将第1位设置为1(已经是1,结果不变) C1 = bitset(A, 1); disp(['After setting bit 1 to 1: ', dec2bin(C1)]); % 00010111 % 将第3位设置为0 C2 = bitset(A, 3, 0); disp(['After setting bit 3 to 0: ', dec2bin(C2)]); % 00000111 (即7) % 将第5位设置为1 C3 = bitset(A, 5, 1); disp(['After setting bit 5 to 1: ', dec2bin(C3)]); % 00110111 (即55) % 省略v,默认设置为1(置位) C4 = bitset(A, 4); % 原第4位是0,设置为1 disp(['After setting bit 4 (default to 1): ', dec2bin(C4)]); % 00011111 (即31) % 对矩阵操作 D = uint8(10); % 1010 D_matrix = bitset(D, [2, 3], [1, 0]); % 将第2位设为1,第3位设为0 disp('After setting bits of D:'); disp(dec2bin(D_matrix)); % 结果为1000 (即8),因为10(1010) -> 第2位1变0? 等等,这里需要重新理解索引 % 更正:10的二进制是1010(4位数),bit1=0, bit2=1, bit3=0, bit4=1 % bitset(D, 2, 1): bit2原来是1,设为1,不变 -> 1010 % bitset(D, 3, 0): bit3原来是0,设为0,不变 -> 1010 % 所以结果还是10,如果D=uint8(2) (0010),bitset(D,2,1) -> 0010 (bit2是1,设为1不变),bitset(D,3,0)->0010 % 再例如 D = uint8(4) (0100) % bitset(D, 1, 1) -> 0101 (5) % bitset(D, 3, 0) -> 0000 (0) % 正确的矩阵操作示例: E = uint8([10, 20; 30, 40]); % 1010, 10100, 11110, 101000 E_set = bitset(E, 3, 1); % 将每个数的第3位都设置为1 disp('Matrix E after setting bit 3 to 1:'); disp(dec2bin(E_set)); % 10 (1010) -> bit3=0 -> 1 -> 1110 (14) % 20 (10100) -> bit3=1 -> 1 -> 10100 (20) % 30 (11110) -> bit3=1 -> 1 -> 11110 (30) % 40 (101000) -> bit3=0 -> 1 -> 101010 (42)
bitset与bitget的协同应用
这两个函数常常结合使用,实现对二进制位的“读取-修改-写入”操作。
示例: 检查某一位是否为1,若不为1则置为1。
A = uint8(23); % 00010111
bit_pos = 4;
% 获取指定位
current_bit = bitget(A, bit_pos);
disp(['Current bit ', num2str(bit_pos), ' is: ', num2str(current_bit)]);
% 如果指定位为0,则将其设置为1
if ~current_bit
A = bitset(A, bit_pos, 1);
disp(['Bit ', num2str(bit_pos), ' was set to 1. New value: ', dec2bin(A)]);
else
disp(['Bit ', num2str(bit_pos), ' is already 1. No change.']);
end
实际应用场景举例
- 模拟硬件I/O端口控制:
假设一个8位的I/O端口,控制8个LED灯。
1表示亮,
