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