【问题标题】:How does the expression "x & (x + (1 << n))" work?表达式“x & (x + (1 << n))”是如何工作的?
【发布时间】:2020-09-14 13:40:52
【问题描述】:
我正在阅读的文字是这样说的:
x & (x + (1
我尝试在 python 控制台中输入不同的值并看到:
>>> 5 & (5 + (1 << 2))
1
但是,当我尝试输入其他不同的值而不是 2 时,我得到了 5 作为答案。我尝试输入从 1 到 7 的值。
我尝试推导表达式,但我做不到。
什么必须是相同的合理解释?它是如何工作的?
【问题讨论】:
标签:
bit-manipulation
bitwise-operators
bit-shift
bitwise-and
【解决方案1】:
我尝试输入从 1 到 7 的值 [for n]
n = 0 也可以。其实让我们先来看这个案例。所以x & (x + 1)。
如果x 是奇数,则x 的形式为a01k(一些位串a,后跟一个零,然后是k 个)。向它添加 1 将遍历所有尾随并将其变成 a10k。与x 一起使用新的尾随零取消旧的尾随,以及与旧0 一起出现的新1。a 保持不变。换句话说:尾随的被重置了。
如果x 是偶数,则加1 不进位,唯一的影响是最低有效位被置位。与x 的AND 然后再次重置该位。总的来说什么都没有发生。
如果n 不为零,那么就好像n 最低有效位不存在。添加不会影响它们,因此 AND 也不会。所以总的来说,x & (x + (1 << n)) 可以描述为“如果从位置n 开始有一系列的,则将该运行归零,否则什么也不做”。
一个可能有趣的变体是x & (x + (x & -x)),它首先使用x & -x 来获取最低有效设置位的掩码,然后与原始表达式相同。这将找到第一个运行并重置它。