按位 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)