C++ 之字节取反
1. 对字节进行取反
如果你想对一个字节的所有位进行取反(即每个位从0变为1,或从1变为0),可以使用位运算符
~
。例如,如果你有一个十六进制数
0x6C
(在C++中可以直接写作0x6C
),你可以这样取反:#include <iostream> #include <bitset> // 用于打印二进制表示 int main() { unsigned char ten = 0x02; unsigned char byte = 0x6C; // 初始值为0x6C byte = ~byte; // 对byte的所有位进行取反 std::cout << "ten: " << std::hex << static_cast<int>(ten) << " (" << std::bitset<8>(ten) << ")" << std::endl; std::cout << "Original: " << std::hex << static_cast<int>(byte) << " (" << std::bitset<8>(byte) << ")" << std::endl; // 打印原始值和二进制表示 std::cout << "Inverted: " << std::hex << static_cast<int>(~byte) << " (" << std::bitset<8>(~byte) << ")" << std::endl; // 再次对结果取反以恢复原始值,并打印二进制表示 unsigned char temp = ten & byte; std::cout << "temp: " << std::hex << static_cast<int>(temp) << " (" << std::bitset<8>(temp) << ")" << std::endl; return 0; }
输出结果:
ten: 2 (00000010) Original: 93 (10010011) Inverted: ffffff6c (01101100) temp: 2 (00000010)
unsigned char temp = ten & ~0x6C; std::cout << "temp1: " << std::hex << static_cast<int>(temp) << " (" << std::bitset<8>(temp) << ")" << std::endl; 输出: ten: 2 (00000010) Original: 93 (10010011) Inverted: ffffff6c (01101100) temp1: 2 (00000010)
当你再次对取反的结果使用
~
操作符时,你将得到原始值。这是因为~
操作符会将所有位取反。例如,对于0x6C
,其取反结果为0xFFFFFF93
(如果byte
是unsigned char
类型的话,实际上只有最低8位有意义,其余高位将被忽略),再次取反则为原始值。如果你想要看到完整的8位二进制表示,可以使用上面代码中的方法通过std::bitset<8>
来打印。注意:
使用
~
操作符时,确保你了解其对数据类型的影响,特别是对于无符号整型和有符号整型。在无符号整型中,所有位都被取反。而在有符号整型中,最高位(符号位)也被取反,这可能会导致数值的符号改变(从正变负或从负变正),除非你明确知道你在做什么。对于有符号整型,通常的做法是先将其转换为无符号类型再进行操作。在上面的示例中,我使用了
static_cast<int>
来确保在打印时能够正确显示数值,因为直接打印无符号字符可能会导致一些混淆或错误的结果。对于演示目的,我使用了这种方式。但在实际编程中,通常不需要这样做,除非你需要查看具体的数值。直接使用无符号字符类型进行计算和操作通常是更安全的。