Аперитив
Всем, наверное, известно, как посчитать количество бит в числе. Например, подойдут следующие два способа:
while (n)
{
++count;
n &= (n-1);
}
while (n)
{
if (n&1)
++count;
n >>= 1;
}
Упражнение: какое в среднем количество операций будет выполнено в первой и во второй реализации?
Блюдо
Пусть у нас есть n-битное число вида 2^i. Нам необходимо найти i за O(1).
Как это сделать? Пусть n = 2^k. Построим последовательность де Брёйна (de Bruijn) над алфавитом {0,1} для подстрок длины k.