#include <stdio.h>
#include <math.h>
#define CHAR_BIT 8
#define INT_BIT CHAR_BIT*sizeof(unsigned int)
static const char LogTable256[256] =
{
#define LT(n) n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n
-1, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,
LT(4), LT(5), LT(5), LT(6), LT(6), LT(6), LT(6),
LT(7), LT(7), LT(7), LT(7), LT(7), LT(7), LT(7), LT(7)
};
/*
Is equal to
LogTable256[0] = LogTable256[1] = 0;
for (int i = 2; i < 256; i++)
{
LogTable256[i] = 1 + LogTable256[i / 2];
}
LogTable256[0] = -1; // if you want log(0) to return -1
*/
void sb(unsigned int* a, unsigned char pos){
*a |= 1 << (INT_BIT-pos-1);
}
int getPosition(unsigned int v){
unsigned logg; // will be lg(v)
register unsigned int t, tt; // temporaries
if (tt = (v >> 16)){
logg = (t = (tt >> 8)) ? 24 + LogTable256[t] : 16 + LogTable256[tt];
}else{
logg = (t = (v >> 8)) ? 8 + LogTable256[t] : LogTable256[v];
}
return (INT_BIT - logg) - 1;
}
printBinaryRepresentation(unsigned int v){
unsigned i;
for (i = 1 << 31; i > 0; i >>= 1){
printf("%u", !!(v&i));
}
printf("\n");
}
int main(void) {
unsigned int a = 0;
sb(&a, 0);
sb(&a, 1);
sb(&a, 2);
sb(&a, 3);
sb(&a, 4);
sb(&a, 5);
sb(&a, 6);
sb(&a, 7);
sb(&a, 8);
sb(&a, 9);
sb(&a, 10);
sb(&a, 11);
sb(&a, 12);
printBinaryRepresentation(a);
printf("Position of first 1 is: %d\n", getPosition(a));
printf("Position of first 0 is: %d\n", getPosition(~a));
return 0;
}