# Bit Counting in C similar to bit twiddling hack

2

I need to make a routine that counts bits in a word that does not involve loops (only bit operations), and does not use large constants.

``````int x = 0xFFFFFFFF;
x += (~((x >> 1) & 0x55555555)+1);
x = (((x >> 2) & 0x33333333) + (x & 0x33333333));
x = (((x >> 4) + x) & 0x0F0F0F0F);
x += (x >> 8);
x += (x >> 16);
return(x & 0x0000003F);
``````

This I found on bit twiddling hacks, but the largest constant I can use is 0xFF... Not sure how to do this otherwise.

Thanks folks.

c
bit-manipulation
counter
bit

4

You can for example use a constant array `COUNTS` which is the number of set bits in the binary representation of numbers from 0 to 15. Then:

``````static inline int byte_count (int x) {
static const int COUNTS = { 0, 1, 1, 2, 1, /* fill in the rest manually */ };
return COUNTS[x & 15] + COUNTS[x >> 4];
}

int count(int x) {
return byte_count(x >> 24) + byte_count((x >> 16) & 255) + byte_count((x >> 8) & 255) + byte_count(x & 255);
}
``````

No loops and no constants larger than 255.

3

``````int x = 0xFF;
x |= (x << 8);  // x = 0xFFFF
x |= (x << 16); // x = 0xFFFFFFFF
``````

and then the rest of the code - provided it works.

### Recursive solution:

``````int foo ( int x )
{
if ( x == 0 )
return 0;
return (x & 1) + foo ( x/2 );
}
``````
0

``````int NumberOfSetBits(int i)