#include <stdio.h>
static unsigned char lookup[256] = {
[0x01]=1, [0x02]=2, [0x04]=3, [0x08]=4, [0x10]=5, [0x20]=6, [0x40]=7, [0x80]=8
};
unsigned log2uint(unsigned y) {
unsigned res = lookup[(y >> 0) & 0xFF];
if (res) return res + 0 - 1;
res = lookup[(y >> 8) & 0xFF];
if (res) return res + 8 - 1;
res = lookup[(y >> 16) & 0xFF];
if (res) return res + 16 - 1;
res = lookup[(y >> 24) & 0xFF];
if (res) return res + 24 - 1;
return 0;
}
int main(void) {
for (int i = 0 ; i != 32 ; i++) {
printf("%d - %d - %d\n", i
, (int)log2uint
(1<<i
), __builtin_ctz
(1<<i
)); }
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CgpzdGF0aWMgdW5zaWduZWQgY2hhciBsb29rdXBbMjU2XSA9IHsKICAgIFsweDAxXT0xLCBbMHgwMl09MiwgWzB4MDRdPTMsIFsweDA4XT00LCBbMHgxMF09NSwgWzB4MjBdPTYsIFsweDQwXT03LCBbMHg4MF09OAp9OwoKdW5zaWduZWQgbG9nMnVpbnQodW5zaWduZWQgeSkgewogICAgdW5zaWduZWQgcmVzID0gbG9va3VwWyh5ID4+ICAwKSAmIDB4RkZdOwogICAgaWYgKHJlcykgcmV0dXJuIHJlcyArICAwIC0gMTsKICAgIHJlcyA9IGxvb2t1cFsoeSA+PiAgOCkgJiAweEZGXTsKICAgIGlmIChyZXMpIHJldHVybiByZXMgKyAgOCAtIDE7CiAgICByZXMgPSBsb29rdXBbKHkgPj4gMTYpICYgMHhGRl07CiAgICBpZiAocmVzKSByZXR1cm4gcmVzICsgMTYgLSAxOwogICAgcmVzID0gbG9va3VwWyh5ID4+IDI0KSAmIDB4RkZdOwogICAgaWYgKHJlcykgcmV0dXJuIHJlcyArIDI0IC0gMTsKICAgIHJldHVybiAwOwp9CgppbnQgbWFpbih2b2lkKSB7Cglmb3IgKGludCBpID0gMCA7IGkgIT0gMzIgOyBpKyspIHsKCQlwcmludGYoIiVkIC0gJWQgLSAlZFxuIiwgaSwgKGludClsb2cydWludCgxPDxpKSwgX19idWlsdGluX2N0eigxPDxpKSk7Cgl9CglyZXR1cm4gMDsKfQo=