我需要一些解释,说明这条特定线是如何工作的。 我知道此函数会计算1的位数,但是该行如何清除最右边的1位呢?
int f(int n) { int c; for (c = 0; n != 0; ++c) n = n & (n - 1); return c; }
有人可以简短地向我解释一下还是给一些“证明”?
任何无符号整数’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的个数。