这个问题已经在这里有一个答案:
- N'(N-1)这是什么表情呢? [重复] 4个答案
我需要一些解释这个特定行是如何工作的。
我知道,这个函数计算1的比特数,但此行究竟是如何清除最右边的1位?
int f(int n) {
int c;
for (c = 0; n != 0; ++c)
n = n & (n - 1);
return c;
}
有些可以解释给我简要地或者给一些“证据”?
这个问题已经在这里有一个答案:
我需要一些解释这个特定行是如何工作的。
我知道,这个函数计算1的比特数,但此行究竟是如何清除最右边的1位?
int f(int n) {
int c;
for (c = 0; n != 0; ++c)
n = n & (n - 1);
return c;
}
有些可以解释给我简要地或者给一些“证据”?
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.
我一直对位操作刷牙和整个这个来了。 它可能不是现在原来的海报(3年后)是有用的,但我要回答反正改善其他观众的质量。
这是什么意思为n & (n-1)
到等于零?
我们应该确保我们知道,因为这是打破循环的唯一方法( n != 0
)。 比方说, n=8
。 该位表示是00001000
。 的位表示为n-1
(或7)将是00000111
。 在&
运营商返回两个参数设置的位。 由于00001000
和00000111
没有任何类似的位设置做,其结果必然是00000000
(或零)。 你可能已经抓获了8号没有被随机选择。 这是一个例子,其中n
是2的2(2,4,8,16等)的所有权力功率将具有相同的结果。
当你传递的东西,是不是2的指数会发生什么? 例如,当n=6
,位表示是00000110
和n-1=5
或00000101
.The &
被施加到这些2个参数,它们仅具有一个单个位的共同点是4。现在, n=4
,其是不为零,所以我们增加c
,并尝试用相同的过程n=4
。 正如我们上面看到的,4是2,因此将打破循环的下一个比较的指数。 它被切断的最右边的位直到n
等于2的幂。
什么是c
?
它仅由一个在0每次循环开始和递增c
被切断的比特的数量的数量等于2的幂之前。