计数位数:这怎么行工作? N = N&第(n-1); [重复](Counting number

2019-07-21 11:15发布

这个问题已经在这里有一个答案:

  • N'(N-1)这是什么表情呢? [重复] 4个答案

我需要一些解释这个特定行是如何工作的。
我知道,这个函数计算1的比特数,但此行究竟是如何清除最右边的1位?

int f(int n) {
    int c;
    for (c = 0; n != 0; ++c) 
        n = n & (n - 1);
    return c;
}

有些可以解释给我简要地或者给一些“证据”?

Answer 1:

Any unsigned integer 'n' will have the following last k digits: One followed by (k-1) zeroes: 100...0 Note that k can be 1 in which case there are no zeroes.

(n - 1) will end in this format: Zero followed by (k-1) 1's: 011...1

n & (n-1) will therefore end in 'k' zeroes: 100...0 & 011...1 = 000...0

Hence n & (n - 1) will eliminate the rightmost '1'. Each iteration of this will basically remove the rightmost '1' digit and hence you can count the number of 1's.



Answer 2:

我一直对位操作刷牙和整个这个来了。 它可能不是现在原来的海报(3年后)是有用的,但我要回答反正改善其他观众的质量。

这是什么意思为n & (n-1)到等于零?

我们应该确保我们知道,因为这是打破循环的唯一方法( n != 0 )。 比方说, n=8 。 该位表示是00001000 。 的位表示为n-1 (或7)将是00000111 。 在&运营商返回两个参数设置的位。 由于0000100000000111没有任何类似的位设置做,其结果必然是00000000 (或零)。 你可能已经抓获了8号没有被随机选择。 这是一个例子,其中n是2的2(2,4,8,16等)的所有权力功率将具有相同的结果。

当你传递的东西,是不是2的指数会发生什么? 例如,当n=6 ,位表示是00000110n-1=500000101 .The &被施加到这些2个参数,它们仅具有一个单个位的共同点是4。现在, n=4 ,其是不为零,所以我们增加c ,并尝试用相同的过程n=4 。 正如我们上面看到的,4是2,因此将打破循环的下一个比较的指数。 它被切断的最右边的位直到n等于2的幂。

什么是c

它仅由一个在0每次循环开始和递增c被切断的比特的数量的数量等于2的幂之前。



文章来源: Counting number of bits: How does this line work ? n=n&(n-1); [duplicate]