Game Development Community

dev|Pro Game Development Curriculum

Bit Counting

by Rick Overman · 01/17/2001 (3:19 pm) · 0 comments

A collection of bit counting routines that I have collected over the years. Fun stuff to unroll and determine why they work.

//-------------------------------------
int bitcount(unsigned value)
{
   int count = 0;
   while (value) 
   {
      count += (value & 1)
      value >>= 1;
   }
   return count;
}


//-------------------------------------
int bitcount(int value)
{
   int count = 0;
   while (value) 
   {
      value &= (value - 1);
      count++;
   }
   return count;
}


//-------------------------------------
int bitcount(unsigned value)
{
   int count;

   for(count = value; value >>= 1; count -= value)  
   {  /* empty */  }

   return count;
}


//-------------------------------------
static char tab[] = {
   0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4,
   1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
   1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
   2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
   1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
   2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
   2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
   3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
   1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
   2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
   2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
   3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
   2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
   3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
   3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
   4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8};

int bitcount(int value)
{
   return tab[value>>24 & 0xff] 
        + tab[value>>16 & 0xff]
        + tab[value>>8  & 0xff] 
        + tab[value     & 0xff];
}


//-------------------------------------
int bitcount(int value)
{
   value = (value>>1 & 0x55555555) + (value & 0x55555555);
   value = (value>>2 & 0x33333333) + (value & 0x33333333);
   value = (value>>4 & 0x0f0f0f0f) + (value & 0x0f0f0f0f);
   value = (value>>8 & 0x00ff00ff) + (value & 0x00ff00ff);

   return (value >> 16) + (value & 0x0000ffff);
}


//-------------------------------------
int bitcount(int value)
{
   value = (value>>1 & 0x55555555) + (value & 0x55555555);
   value = (value>>2 & 0x33333333) + (value & 0x33333333);
   value = ((value>>4) + value) & 0x0f0f0f0f;
   value = ((value>>8) + value);

   return ((value>>16) + value) & 0x3f;
}


//-------------------------------------
int bitcount(int value)
{
   value = (value>>1 & 0x55555555) + (value & 0x55555555);
   value = (value>>2 & 0x33333333) + (value & 0x33333333);

   return (((value>>4) + value) & 0x0f0f0f0f) % 0xff;
}


//-------------------------------------
int bitcount(int value)
{
   value -= (value>>1 & 0x77777777) 
          + (value>>2 & 0x33333333) 
          + (value>>3 & 0x11111111);

   return (((value>>4) + value) & 0x0f0f0f0f) % 0xff;
}