#include <stdio.h>

unsigned int bits0(unsigned int num) {
	int count = 0; while(num) num >>=1, ++count; return count;	
}
unsigned int bits1(unsigned int x) {
   int y, m=0, n=0;

   y = x - 0x100;       
   m = (y >> 16) & 8;
   n = n + m;
   x = x << m;

   y = x - 0x1000;      
   m = (y >> 16) & 4;
   n = n + m;
   x = x << m;

   y = x - 0x4000;      
   m = (y >> 16) & 2;
   n = n + m;
   x = x << m;

   y = x >> 14;         
   m = y & ~(y >> 1);
   return 14 - n + m;
}
int main(int argc, char **argv) {
	unsigned int j=1<<12,i=0;
	for (;i<10;++i,j<<=1){
	  unsigned int d = j|1;
	  printf("%lu==%lu\n", bits0(d), bits1(d));
	}
	for (i=1;i<65536;++i)
		if(bits0(i)!=bits1(i))
	  		printf("ERROR i=%d %lu!=%lu\n", bits0(i), bits1(i));
		
  return 0;
}