#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;
}
I2luY2x1ZGUgPHN0ZGlvLmg+Cgp1bnNpZ25lZCBpbnQgYml0czAodW5zaWduZWQgaW50IG51bSkgewoJaW50IGNvdW50ID0gMDsgd2hpbGUobnVtKSBudW0gPj49MSwgKytjb3VudDsgcmV0dXJuIGNvdW50OwkKfQovL2ludCBsbjIoaW50IHgpIHtyZXR1cm4gbG4oeCw4LDEpO30gLy8gOCDQv9C+0YHRgtCw0LLQuNGC0Ywgc2l6ZW9mLzIg0LTQu9GPINGD0L3QuNCy0LXRgNGB0LDQu9GM0L3QvtGB0YLQuAppbnQgbG4yKGludCB4KSB7cmV0dXJuIGxuMSh4LDgsMSk7fSAvLyA4INC/0L7RgdGC0LDQstC40YLRjCBzaXplb2YvMiDQtNC70Y8g0YPQvdC40LLQtdGA0YHQsNC70YzQvdC+0YHRgtC4CgppbnQgbG4oaW50IHgsIGludCBzaGlmdCwgaW50IG4pIHsKICAgIGludCB5ID0geCA+PiBzaGlmdDsgCiAgICBpZiAoeSAhPSAwKSB7eD15O24gKz0gc2hpZnQ7fQogICAgcmV0dXJuIChzaGlmdCE9MCkgPyBsbih4LHNoaWZ0Pj4xLG4pOiBuOwp9CmludCBsbjEoaW50IHgsIGludCBzaGlmdCwgaW50IG4pIHsKICAgIGludCB5ID0geCA+PiBzaGlmdDsgCiAgICBpZiAoeSAhPSAwKSB7eD15O24gKz0gc2hpZnQ7fQogICAgcmV0dXJuIChzaGlmdCE9MikgPyBsbih4LHNoaWZ0Pj4xLG4pOiBuKyh4Pj4xKTsKfQppbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKCXVuc2lnbmVkIGludCBqPTE8PDEsaT0wOwoJZm9yICg7aTwxNTsrK2ksajw8PTEpewoJICB1bnNpZ25lZCBpbnQgZCA9IGp8MTsKCSAgcHJpbnRmKCIlbHU9PSVsdVxuIiwgYml0czAoZCksIGxuMihkKSk7Cgl9Ci8vICByZXR1cm4gMDsJCglmb3IgKGk9MTtpPDY1NTM2OysraSkKCQlpZihiaXRzMChpKSE9bG4yKGkpKQoJICAJCXByaW50ZigiRVJST1IgaT0lZCAlbHUhPSVsdVxuIiwgYml0czAoaSksIGxuMihpKSk7CgkJCiAgcmV0dXJuIDA7Cn0=