异或运算性质

由上面的后两条可以得出:

消去最低位的 1:n & (n - 1)

image.png

取出最低位的 1(lowbit):s & -s

     s = 101100
    ~s = 010011
(~s)+1 = 010100 // 根据补码的定义,这就是 **-s**   效果:s 的最低 1 左侧取反,右侧不变
s & -s = 000100 // lowbit

可简单记为:「原码与补码」

只保留二进制的低 n 位: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`。

将第 n 位设为 1:res |= (1 << n)

这个就比较简单了

二进制最高位:int highBit = 31 - Integer.numberOfLeadingZeros(max);

位运算注意事项

<aside> ⚠️

注意位运算的优先级比不上四则运算的优先级,各种位运算的优先级也不是同级的,所以记不住优先级就别忘了加括号!

</aside>