位数:这条线是怎么工作的?n = n(n - 1);(复制)

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


This question already has an answer here:

这个问题已经有了答案:

I need some explanation how this specific line works.
I know that this function counts the number of 1's bits, but how exactly this line clears the rightmost 1 bit?

我需要解释一下这条线是如何工作的。我知道这个函数计算1位的个数,但是这条线是怎么清除最右边的1位的呢?

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

Can some explain it to me briefly or give some "proof"?

能不能给我简单的解释一下或者给我一些“证据”?

2 个解决方案

#1


16  

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

任何无符号整数'n'都有以下最后k个数字:1后面跟着(k-1) 0: 100……注意k可以是1,在这种情况下没有0。

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

(n -1)将以以下格式结束:0,然后(k-1) 1的:011…1

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

n和(n-1)将因此以k' 0结尾: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.

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

#2


3  

I've been brushing up on bit manipulation and came across this. It may not be useful to the original poster now (3 years later), but I am going to answer anyway to improve the quality for other viewers.

我一直在温习位操作,并偶然发现了这个。这可能对现在(三年后)的原版海报没有什么用处,但我还是要回答,以提高其他观众的质量。

What does it mean for n & (n-1) to equal zero?

n和(n-1)等于0意味着什么?

We should make sure we know that since that is the only way to break the loop (n != 0).Let's say n=8. The bit representation for that would be 00001000. The bit representation for n-1 (or 7) would be 00000111. The & operator returns the bits set in both arguments. Since 00001000 and 00000111 do not have any similar bits set, the result would be 00000000 (or zero).You may have caught on that the number 8 wasn't randomly chosen. It was an example where n is power of 2. All powers of 2 (2,4,8,16,etc) will have the same result.

我们应该确保我们知道,因为这是唯一打破循环的方法(n != 0)假设n=8。它的位表示是00001000。n-1(或7)的位表示是00000111。运算符返回两个参数中设置的位。由于0000000111和00000000111没有任何相似的位集,结果将是00000000(或0)。你可能已经意识到数字8不是随机选择的。这是一个例子,n是2的幂。2(2,4,8,16等)的所有幂都将得到相同的结果。

What happens when you pass something that is not an exponent of 2? For example, when n=6, the bit representation is 00000110 and n-1=5 or 00000101.The & is applied to these 2 arguments and they only have one single bit in common which is 4. Now, n=4 which is not zero so we increment c and try the same process with n=4. As we've seen above, 4 is an exponent of 2 so it will break the loop in the next comparison. It is cutting off the rightmost bit until n is equal to a power of 2.

如果传递的不是2的指数会怎样?例如,当n=6时,位表示为00000110和n-1=5或00000101。这个&用于这两个参数,它们只有一个相同的位,就是4。现在,n=4不是0,所以我们增加c,然后对n=4进行同样的处理。正如我们在上面看到的,4是2的指数,所以它将在下一次比较中打破循环。它切断了最右边的位直到n等于2的幂。

What is c?

c语言是什么?

It is only incrementing by one every loop and starts at 0. c is the number of bits cut off before the number equals a power of 2.

它每循环递增一个,从0开始。c是在数字等于2的幂之前被切断的比特数。


注意!

本站翻译的文章,版权归属于本站,未经许可禁止转摘,转摘请注明本文地址:https://www.itdaan.com/blog/2013/03/12/71256e447d15e3645e61b58f6cafeecd.html



n&(n-1)的用途 n&(n-1)的用法 n&(n-1)的妙用 n&(n-1)的用法 n&(n-1)的用处 ((n&(n-1))==0)的含义 n&(n-1)的应用 n&(n-1) 与 n&-n 解释(n&(n-1))==0的具体含义 n&(n-1)位运算的妙用
 
粤ICP备14056181号  © 2014-2021 ITdaan.com