【问题标题】: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 &amp; (x + 1)

如果x 是奇数,则x 的形式为a01k(一些位串a,后跟一个零,然后是k 个)。向它添加 1 将遍历所有尾随并将其变成 a10k。与x 一起使用新的尾随零取消旧的尾随,以及与旧0 一起出现的新1。a 保持不变。换句话说:尾随的被重置了。

如果x 是偶数,则加1 不进位,唯一的影响是最低有效位被置位。与x 的AND 然后再次重置该位。总的来说什么都没有发生。

如果n 不为零,那么就好像n 最低有效位不存在。添加不会影响它们,因此 AND 也不会。所以总的来说,x &amp; (x + (1 &lt;&lt; n)) 可以描述为“如果从位置n 开始有一系列的,则将该运行归零,否则什么也不做”。

一个可能有趣的变体是x &amp; (x + (x &amp; -x)),它首先使用x &amp; -x 来获取最低有效设置位的掩码,然后与原始表达式相同。这将找到第一个运行并重置它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-11
    • 1970-01-01
    • 2016-12-04
    • 2022-06-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多