fork(1) download
  1. #include <stdio.h>
  2.  
  3. unsigned int bits0(unsigned int num) {
  4. int count = 0; while(num) num >>=1, ++count; return count;
  5. }
  6. //int ln2(int x) {return ln(x,8,1);} // 8 поставить sizeof/2 для универсальности
  7. int ln2(int x) {return ln1(x,8,1);} // 8 поставить sizeof/2 для универсальности
  8.  
  9. int ln(int x, int shift, int n) {
  10. int y = x >> shift;
  11. if (y != 0) {x=y;n += shift;}
  12. return (shift!=0) ? ln(x,shift>>1,n): n;
  13. }
  14. int ln1(int x, int shift, int n) {
  15. int y = x >> shift;
  16. if (y != 0) {x=y;n += shift;}
  17. return (shift!=2) ? ln(x,shift>>1,n): n+(x>>1);
  18. }
  19. int main(int argc, char **argv) {
  20. unsigned int j=1<<1,i=0;
  21. for (;i<15;++i,j<<=1){
  22. unsigned int d = j|1;
  23. printf("%lu==%lu\n", bits0(d), ln2(d));
  24. }
  25. // return 0;
  26. for (i=1;i<65536;++i)
  27. if(bits0(i)!=ln2(i))
  28. printf("ERROR i=%d %lu!=%lu\n", bits0(i), ln2(i));
  29.  
  30. return 0;
  31. }
Success #stdin #stdout 0s 2248KB
stdin
Standard input is empty
stdout
2==2
3==3
4==4
5==5
6==6
7==7
8==8
9==9
10==10
11==11
12==12
13==13
14==14
15==15
16==16