计算int中的位 - 为什么此代码有效?

Gre*_*reg -1 c binary integer bit

我试图更多地了解比特,我遇到了这个例子.

这段代码如何计算这些位?(顺便说一句,我的C很生锈).

unsigned int v; // count the number of bits set in v
unsigned int c; // c accumulates the total bits set in v

for (c = 0; v; v >>= 1)
{
  c += v & 1;
}
Run Code Online (Sandbox Code Playgroud)

Amb*_*ber 9

v & 1如果设置了最低位,则为1;如果不是,v则为0.

循环保持在v每次迭代时将右边的位移位1位,因此v在原始位置上的每个位上的最低位循环v(因为每个位在"分离"小数结束之前到达1的位置).

因此,它在每个位上循环并且如果它被设置则将c加1,如果不是则加0,从而总计原始v中的设置位.

例如,对于一个开始v1011:

  1. 1011 & 1 = 1,所以c增加到1.
  2. 然后1011转移成为101.
  3. 101 & 1 = 1,所以c增加到2.
  4. 101变成了10.
  5. 10 & 1 = 0,所以c不增加并保持2.
  6. 10变成了1.
  7. 1 & 1 = 1,所以c增加到3.
  8. 1转移成为0(因为最后一点从分数结束).
  9. 由于for循环的条件是正好的v,并且v现在是0,这是一个假值,循环停止.

最终结果,c = 3,正如我们所希望的那样.