#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;
}
I2luY2x1ZGUgPHN0ZGlvLmg+Cgp1bnNpZ25lZCBpbnQgYml0czAodW5zaWduZWQgaW50IG51bSkgewoJaW50IGNvdW50ID0gMDsgd2hpbGUobnVtKSBudW0gPj49MSwgKytjb3VudDsgcmV0dXJuIGNvdW50OwkKfQp1bnNpZ25lZCBpbnQgYml0czEodW5zaWduZWQgaW50IHgpIHsKICAgaW50IHksIG09MCwgbj0wOwoKICAgeSA9IHggLSAweDEwMDsgICAgICAgCiAgIG0gPSAoeSA+PiAxNikgJiA4OwogICBuID0gbiArIG07CiAgIHggPSB4IDw8IG07CgogICB5ID0geCAtIDB4MTAwMDsgICAgICAKICAgbSA9ICh5ID4+IDE2KSAmIDQ7CiAgIG4gPSBuICsgbTsKICAgeCA9IHggPDwgbTsKCiAgIHkgPSB4IC0gMHg0MDAwOyAgICAgIAogICBtID0gKHkgPj4gMTYpICYgMjsKICAgbiA9IG4gKyBtOwogICB4ID0geCA8PCBtOwoKICAgeSA9IHggPj4gMTQ7ICAgICAgICAgCiAgIG0gPSB5ICYgfih5ID4+IDEpOwogICByZXR1cm4gMTQgLSBuICsgbTsKfQppbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKCXVuc2lnbmVkIGludCBqPTE8PDEyLGk9MDsKCWZvciAoO2k8MTA7KytpLGo8PD0xKXsKCSAgdW5zaWduZWQgaW50IGQgPSBqfDE7CgkgIHByaW50ZigiJWx1PT0lbHVcbiIsIGJpdHMwKGQpLCBiaXRzMShkKSk7Cgl9Cglmb3IgKGk9MTtpPDY1NTM2OysraSkKCQlpZihiaXRzMChpKSE9Yml0czEoaSkpCgkgIAkJcHJpbnRmKCJFUlJPUiBpPSVkICVsdSE9JWx1XG4iLCBiaXRzMChpKSwgYml0czEoaSkpOwoJCQogIHJldHVybiAwOwp9