Code:
#include<stdio.h>
#include<stdlib.h>
int findBit ( unsigned long val ) {
int result = 0;
if ( val >= 0x10000 ) {
result += 16;
val >>= 16;
}
if ( val >= 0x100 ) {
result += 8;
val >>= 8;
}
if ( val >= 0x10 ) {
result += 4;
val >>= 4;
}
if ( val >= 0x4 ) {
result += 2;
val >>= 2;
}
if ( val >= 0x2 ) {
result += 1;
val >>= 1;
}
return result + val;
}
int main ( ) {
unsigned long tests[] = {
0, 0x1, 0x100000, 0x400000, 0x80000000
};
int i;
for ( i = 0 ; i < sizeof tests / sizeof *tests ; i++ ) {
printf("%08lx = %d\n", tests[i], findBit(tests[i]) );
}
return 0;
}
$ gcc foo.c
$ ./a.exe
00000000 = 0
00000001 = 1
00100000 = 21
00400000 = 23
80000000 = 32
64 bits is just one more test.