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