C++ 無二進制字面量,常用八進制 (0 開頭) 或十六進制 (0x 開頭)。int a = 0x80 表示低 8 位為 1,值為 128。
<< 左移,右補 0。>> 右移:無符號數左補 0;有符號數實現定義(GCC 補符號位)。| 操作 | 代碼 |
|---|---|
| 設置第 n 位為 1 | expr |= (1 << n); |
| 清除第 n 位 | expr &= ~(1 << n); |
| 測試第 n 位 | bool b = expr & (1 << n); |
| 翻轉第 n 位 | expr ^= (1 << n); |
| 清除最低位 1 | expr &= (expr - 1); |
| 傳播最低位 1 | expr |= (expr - 1); |
| 判斷 2 的冪次 | (expr & (expr - 1)) == 0 |
| 清除右側連續 1 | expr = ((expr | (expr - 1)) + 1) & expr; |
| 判斷兩冪次之差 | (((expr | (expr - 1)) + 1) & expr) == 0 |
int NextN(int N) {
int x = N & (-N);
int t = N + x;
return t | ((N ^ t) / x) >> 2;
}
// 無解返回 -1
位操作是底層優化利器,掌握上述模式可大幅提升性能。