Просто напишу код целочисленного логарифма по основанию 2, может кому пригодится
using System;
class Log2Test {
static uint pop(uint x)
{
uint n;
n = (x >> 1) & 0x77777777;
x = x - n;
n = (n >> 1) & 0x77777777;
x = x - n;
n = (n >> 1) & 0x77777777;
x = x - n;
x = (x + (x >> 4)) & 0x0f0f0f0f;
x = x * 0x01010101;
return x >> 24;
}
static uint log2(uint x)
{
x = x | (x >> 1);
x = x | (x >> 2);
x = x | (x >> 4);
x = x | (x >> 8);
x = x | (x >> 16);
return pop(x)-1;
}
static void Main() {
for(int i = 0; i < 31; i++)
{
uint x = 2U << i;
Console.WriteLine("log2({0})={1}", x, log2(x));
}
}
}