This is a method I know of for doing this, it will only iterate for the number of bits set in v
, at the end of execution c
will hold the number of bits in v
:
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; c++)
{
v &= v - 1; // clear the least significant bit set
}
source: C Programming Language 2nd Ed. (by Brian W. Kernighan and Dennis M. Ritchie)
example:
v = 1010; //2 bits are set
v - 1 = 1010(10 decimal) - 1 = 1001(9 decimal)
1010
1001 &
------
1000 The least significant bit is unset, c is incremented by 1
v = 1000
v - 1 = 1000 - 1 = 0111
1000
0111 &
-------
0000 The least significant bit is unset again, c is incremented
by 1, the loop stops because there are no more set bits.