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