由上面的后两条可以得出:
n & (n - 1)
s & -s
s = 101100
~s = 010011
(~s)+1 = 010100 // 根据补码的定义,这就是 **-s** 效果:s 的最低 1 左侧取反,右侧不变
s & -s = 000100 // lowbit
可简单记为:「原码与补码」
x = x & ((1 << n) - 1)
### 位运算公式解释:
表达式 `x = x & ((1 << n) - 1)` 的作用是只保留整数 `x` 的低 n 位,其余位清零。
### 原理分析:
1. **位移操作 `(1 << n)`**:
- `1 << n` 的含义是将数字 `1` 左移 `n` 位,相当于生成了一个值,其中只有第 位是 `1`,其余位是 `0`。例如:
2. **减法操作 `((1 << n) - 1)`**:
- 通过减 `1`,将最高位的 `1` 变为 `0`,而低 位全部变为 `1`。例如:
3. **与操作 `x & ((1 << n) - 1)`**:
- `x` 的每一位与低 位掩码相与,只保留 的低 位,其余位清零。掩码保证了低 位为 `1`,高位为 `0`。
res |= (1 << n)
这个就比较简单了
int highBit = 31 - Integer.numberOfLeadingZeros(max);
<aside> ⚠️
注意位运算的优先级比不上四则运算的优先级,各种位运算的优先级也不是同级的,所以记不住优先级就别忘了加括号!
</aside>