I was wondering if somebody knows a faster way to implement the function below, a computation of logarithm of 2 ceiling on integers, in C#.
private int Log2Ceil(int x)
{
   return (int)Math.Ceiling(Math.Log((double)x, 2));
}
I was wondering if somebody knows a faster way to implement the function below, a computation of logarithm of 2 ceiling on integers, in C#.
private int Log2Ceil(int x)
{
   return (int)Math.Ceiling(Math.Log((double)x, 2));
}
 
    
    See the answer to this question. The code it references is in C, but most of it works in C# as well.
Alternatively, you can use
private int Log2Ceil(int n) {
    long bits = BitConverter.DoubleToInt64Bits((double)n);
    return ((int)(bits >> 52) & 0x7ff) - 1022;
}
which uses the fact that floating-point numbers contain an encoding of the binary exponent. A quick benchmark showed this to be 13x faster than your original on x64 and about 21x faster on x86.
 
    
     
    
    I also found another way to do that, as described here.
private int Log2Ceil(int x)
{
    uint v = (uint)(x - 1); // 32-bit word to find the log base 2 of
    uint r = 0; // r will be lg(v)
    while (v > 0) // unroll for more speed...
    {
        v >>= 1;
        r++;
    }
    return (int)r;
}
