Welcome to little lamb

Code » test-msb » next » tree

[next] / src / m1.c

#include <stdint.h>

typedef uint64_t u64;

int msb(u64 v)
{
    if (!v) return 0;

    int k = 0;
    if (v > 0xFFFFFFFFUL) { v >>= 32; k  = 32; }
    if (v > 0x0000FFFFUL) { v >>= 16; k |= 16; }
    if (v > 0x000000FFUL) { v >>= 8;  k |= 8;  }
    if (v > 0x0000000FUL) { v >>= 4;  k |= 4;  }
    if (v > 0x00000003UL) { v >>= 2;  k |= 2;  }
    if (v > 0x00000001UL) { k |= 1; }

    return k + 1;
}