给定一个数字n
,按位运算n & (n - 1)
总是产生一个与n
相距1位的数字。下面是一些示例:
n = 4 => b'100' & b'011' = b'000'
n = 5 => b'101' & b'100' = b'100'
n = 6 => b'110' & b'101' = b'100'
换句话说,n & (n - 1)
总是从n
中清除1位。为什么是这样?有人可以提供证明吗?
答案 0 :(得分:2)
一些初步的评论:
1&1==1
和0&0==0
)中相同的位(相同)复制,当相应的位< em>不同(1&0==0
和0&1==0
)。 在 n 为奇数时,减1很容易:您只需清除最后的1位就可以了。当 n 不为奇数时,您需要从相邻的位“借用”,这会导致潜在的借用级联,直到找到可以借用的1位为止(请参见《美国方法手册》在Wikipedia上减去)。这意味着,从右边开始(在 n 的最低有效位),您将一位一位地翻转,直到遇到第一个1位,该位也被翻转。
因此,在减法运算中,您会翻转一组恰好包括一个 1位的位,因此,这是唯一被翻转为0位的位。
n 的按位与运算将为获取 n-1 而翻转的每一位产生一个0,但将保留其他任何 n 和以前一样,实际上清除了 n 的 one 1位。
由此得出的结果是,被清除的位始终是 n 中的最低有效1位。