位操作(n1 ^ (n2 & -n2))的结果是什么?

我们来一步步分析 n1 ^ (n2 & -n2) 这个表达式。

1. 理解 n2 & -n2

这是位操作中一个经典的技巧,用于获取数字的最低有效位(Lowest Set Bit, LSB)

原理:

  • -n2 在二进制补码中等于 ~n2 + 1
  • n2 & -n2 的结果会保留 n2 的最右边的 1,其他位都变为 0

示例:

n2 = 12 (二进制: 1100)
-n2 = -12 (二进制补码: ...11110100)
n2 & -n2 = 4 (二进制: 0100)
          ↑
          只保留了最右边的1

2. 理解完整的表达式 n1 ^ (n2 & -n2)

作用:

  • n2 & -n2 得到一个只有一位是1的数字(即n2的最低有效位)
  • 然后将这个结果与 n1 进行异或(XOR)操作

异或的特性:

  • 异或是按位操作0^0=0, 0^1=1, 1^0=1, 1^1=0
  • 与一个只有一位是1的数异或,相当于翻转n1的对应位

3. 实际效果

假设 n2 & -n2 = mask(mask只有一位是1,其他都是0),那么:

n1 ^ mask = 将n1在mask为1的那一位进行翻转

具体例子:

n1 = 13    # 二进制: 1101
n2 = 12    # 二进制: 1100

# 计算过程:
n2 & -n2 = 12 & -12
        = 1100 & 0100  (假设8位:-12=11110100)
        = 0100 = 4

n1 ^ (n2 & -n2) = 13 ^ 4
                = 1101 ^ 0100
                = 1001 = 9

结果:1101 变成了 1001翻转了从右往左数第3位(0-based索引为2)

4. 应用场景

这个操作在树状数组(Fenwick Tree) 等数据结构中很常见:

# 在树状数组中更新下一个索引
def next_index(i):
    return i + (i & -i)

# 在树状数组中查询前一个索引  
def prev_index(i):
    return i - (i & -i)

5. 总结

n1 ^ (n2 & -n2) 的结果是:

  1. 先提取 n2 的最低有效位(得到一个只有一位是1的数)
  2. n1 在对应位上翻转(0变1或1变0)
  3. 其他位保持不变

最终效果:将n1在n2最低有效位对应的位置上进行位翻转。

Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐