我在部分代码中有这个。任何人都可以解释i & (i ^ (i - 1))
如何缩减为i & (-i)
?
答案 0 :(得分:3)
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)