#include <stdio.h>

unsigned int bits0(unsigned int num) {
	int count = 0; while(num) num >>=1, ++count; return count;	
}
//int ln2(int x) {return ln(x,8,1);} // 8 поставить sizeof/2 для универсальности
int ln2(int x) {return ln1(x,8,1);} // 8 поставить sizeof/2 для универсальности

int ln(int x, int shift, int n) {
    int y = x >> shift; 
    if (y != 0) {x=y;n += shift;}
    return (shift!=0) ? ln(x,shift>>1,n): n;
}
int ln1(int x, int shift, int n) {
    int y = x >> shift; 
    if (y != 0) {x=y;n += shift;}
    return (shift!=2) ? ln(x,shift>>1,n): n+(x>>1);
}
int main(int argc, char **argv) {
	unsigned int j=1<<1,i=0;
	for (;i<15;++i,j<<=1){
	  unsigned int d = j|1;
	  printf("%lu==%lu\n", bits0(d), ln2(d));
	}
//  return 0;	
	for (i=1;i<65536;++i)
		if(bits0(i)!=ln2(i))
	  		printf("ERROR i=%d %lu!=%lu\n", bits0(i), ln2(i));
		
  return 0;
}