按位 NOT(一元补码)
unsigned char a = 234; // 1110 1010b (0xEA)
unsigned char b = ~a; // 0001 0101b (0x15)
std::cout << "a = " << static_cast<int>(a) <<
", b = " << static_cast<int>(b) << std::endl;
输出
a = 234, b = 21
为什么
有点明智的 NOT
(一元补码)在位级操作,只是翻转每个位。如果它是一个 1
,它会变成一个 0
,如果它是一个 0
,它就变成了 1
。对于特定类型,比特方式 NOT 与对特定值的最大值进行异或运算具有相同的效果:
unsigned char a = 234; // 1110 1010b (0xEA)
unsigned char b = ~a; // 0001 0101b (0x15)
unsigned char c = a ^ ~0;
位智能 NOT 也可以是检查特定积分类型的最大值的便捷方式:
unsigned int i = ~0;
unsigned char c = ~0;
std::cout << "max uint = " << i << std::endl <<
"max uchar = " << static_cast<short>(c) << std::endl;
有点 NOT 不会改变原始值的值,也没有复合赋值运算符,所以你不能做 a ~= 10
。
在逐位 NOT(~
)不应与混淆逻辑 NOT(!
); 有点明智的 NOT 会翻转每一位,逻辑 NOT 将使用整个值来进行操作,换句话说 (!1) != (~1)