Per Nordlöw:

I'm looking for a function that figures out the number of bits that are needed to represent a zero-based integer:


// http://stackoverflow.com/questions/3272424/compute-fast-log-base-2-ceiling

uint ceilLog2(ulong x) pure nothrow @safe @nogc
in {
    assert(x > 0);
} body {
    static immutable ulong[6] t = [
        0xFFFFFFFF00000000UL,
        0x00000000FFFF0000UL,
        0x000000000000FF00UL,
        0x00000000000000F0UL,
        0x000000000000000CUL,
        0x0000000000000002UL];

    uint y = (((x & (x - 1)) == 0) ? 0 : 1);
    uint j = 32;

    foreach (immutable uint i; 0 .. 6) {
        immutable k = (((x & t[i]) == 0) ? 0 : j);
        y += k;
        x >>= k;
        j >>= 1;
    }

    return y;
}

void main() {
    import std.stdio;

    foreach (immutable uint i; 1 .. 18)
        writeln(i, " ", i.ceilLog2);
}


Bye,
bearophile

Reply via email to