为什么" i& (i ^(i - 1))"相当于" i& (-i)"

时间:2014-07-16 05:15:29

标签: bit-manipulation

我在部分代码中有这个。任何人都可以解释i & (i ^ (i - 1))如何缩减为i & (-i)

1 个答案:

答案 0 :(得分:3)

最后1位的i变为1之后,

i ^ (i - 1)使所有位

例如,如果i的二进制表示为abc...de10...0,那么i - 1将为abc...de01...1二进制。当从i减去1时,最后1位之前的部分不会改变,因此xor彼此之间的返回0,而剩余部分将是1,因为i和{之间存在差异{1}}。之后i - 1将获得i的最后1位

i & (i ^ (i - 1))将所有位反转到i的最后1位,因为在两个补码-i中,-i == ~i + 1的结果与上面相同

例如:

i & (-i)