C++ 中常用的一些位操作、字节操作
1. 位操作
符号 | 描述 | 运算规则 |
---|---|---|
& | 与 | 两个位都为1时,结果才为1 |
| | 或 | 两个位都为0时,结果才为0 |
^ | 异或 | 两个位相同为0,相异为1 |
~ | 取反 | 0变1,1变0 |
<< | 左移 | 各二进位全部左移若干位,高位丢弃,低位补0 (左移操作符将操作数的位向左移动指定的位数,右边补0。左移相当于对数字进行2的n次幂的乘法运算(n为移动的位数)。) |
>> | 右移 | 各二进位全部右移若干位,对无符号数,高位补0,有符号数,各编译器处理方法不一样,有的补符号位(算术右移),有的补0 (逻辑右移) |
较为常用的是移位操作。组合起来可以进行字节操作。
2. 字节操作
#include <iostream>
int main() {
uint32_t num = 0x12345678;
// 提取低位字节 (0x78)
uint8_t lowByte = num & 0xFF;
// 提取次低位字节 (0x56)
uint8_t secondByte = (num >> 8) & 0xFF;
// 提取次高位字节 (0x34)
uint8_t thirdByte = (num >> 16) & 0xFF;
// 提取高位字节 (0x12)
uint8_t highByte = (num >> 24) & 0xFF;
std::cout << "Low Byte: " << std::hex << (int)lowByte << std::endl;
std::cout << "Second Byte: " << std::hex << (int)secondByte << std::endl;
std::cout << "Third Byte: " << std::hex << (int)thirdByte << std::endl;
std::cout << "High Byte: " << std::hex << (int)highByte << std::endl;
return 0;
}
使用位操作进行字节提取的核心思想是通过**移位和掩码**操作来访问特定位置的字节。
具体来说,位操作提取字节的核心思想包括以下几个步骤:
(1)右移:将目标字节移动到最右边(最低有效字节)的位置。
(2)掩码:使用掩码(mask)来屏蔽掉不需要的位,只保留目标字节。
具体操作
右移操作
右移操作符(>>
)用于将一个数的所有位向右移动指定的位数。右移的位数通常是 (n * 8)
,其中 n
是目标字节的位置,从0开始计数,最右边的字节为0。例如,如果我们想要提取第3个字节(从右数),需要将数据右移24位。
掩码操作
掩码是一个二进制数,用于屏蔽不需要的位。最常用的掩码是 0xFF
,即二进制的 11111111
,它可以用来提取一个字节的所有位。通过与操作(&
),可以保留掩码中为1的位,其他位都被清零。