Get frist 0 / first 1 of bit-representation of int

Run Settings
LanguageC
Language Version
Run Command
#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; }
Editor Settings
Theme
Key bindings
Full width
Lines