DeepSeek总结的`n1 ^ (n2 & -n2)`位操作的含义
·
位操作(n1 ^ (n2 & -n2))的结果是什么?
我们来一步步分析 n1 ^ (n2 & -n2) 这个表达式。
1. 理解 n2 & -n2
这是位操作中一个经典的技巧,用于获取数字的最低有效位(Lowest Set Bit, LSB)。
原理:
-n2在二进制补码中等于~n2 + 1n2 & -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) 的结果是:
- 先提取
n2的最低有效位(得到一个只有一位是1的数) - 将
n1在对应位上翻转(0变1或1变0) - 其他位保持不变
最终效果:将n1在n2最低有效位对应的位置上进行位翻转。
更多推荐



所有评论(0)