一尘不染

计算位数:这条线如何工作?n = n&(n-1);

algorithm

我需要一些解释,说明这条特定线是如何工作的。
我知道此函数会计算1的位数,但是该行如何清除最右边的1位呢?

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

有人可以简短地向我解释一下还是给一些“证明”?


阅读 314

收藏
2020-07-28

共1个答案

一尘不染

任何无符号整数’n’将具有以下最后k位数字:1后跟(k-1)个零:100 … 0请注意,在这种情况下,k可以为1,不存在零。

(n-1)将以以下格式结束:零后跟(k-1)1’s:011 … 1

n&(n-1)因此以’k’零结尾:100 … 0&011 … 1 = 000 … 0

因此,n&(n-1)将消除最右边的“ 1”。每次迭代基本上都会删除最右边的“ 1”位,因此您可以计算1的个数。

2020-07-28