为什么n&(n-1)总是从n中清除1位?

时间:2019-12-18 19:26:57

标签: bit-manipulation

给定一个数字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位。为什么是这样?有人可以提供证明吗?

1 个答案:

答案 0 :(得分:2)

一些初步的评论:

  • n 不为零时,该语句为true。至少必须有一个1位。
  • 按位与运算将两个操作数(1&1==10&0==0)中相同的位(相同)复制,当相应的位< em>不同(1&0==00&1==0)。

n 为奇数时,减1很容易:您只需清除最后的1位就可以了。当 n 不为奇数时,您需要从相邻的位“借用”,这会导致潜在的借用级联,直到找到可以借用的1位为止(请参见《美国方法手册》在Wikipedia上减去)。这意味着,从右边开始(在 n 的最低有效位),您将一位一位地翻转,直到遇到第一个1位,该位也被翻转。

因此,在减法运算中,您会翻转一组恰好包括一个 1位的位,因此,这是唯一被翻转为0位的位。

n 的按位与运算将为获取 n-1 而翻转的每一位产生一个0,但将保留其他任何 n 和以前一样,实际上清除了 n one 1位。

由此得出的结果是,被清除的位始终是 n 中的最低有效1位。