Есть хитрый трюк с битами: x & -x изолирует последний 1-бит.Следующая программа на C использует таблицу поиска, основанную на последовательностях де Брейна, для вычисления числа конечных (!) Нулей числа в постоянное (!) Время:
unsigned int x; // find the number of trailing zeros in 32-bit x
int r; // result goes here
int table[32] =
{
0, 1, 28, 2, 29, 14, 24, 3, 30, 22, 20, 15, 25, 17, 4, 8,
31, 27, 13, 23, 21, 19, 16, 7, 26, 12, 18, 6, 11, 5, 10, 9
};
r = table[((uint32_t)((x & -x) * 0x077CB531U)) >> 27];
Это делается на языке ассемблера (который яперестал учиться к 16 годам) должно быть никаких проблем.Теперь все, что вам нужно сделать, это обратить биты в num и применить методику, описанную выше.
Я написал статью об уловке, описанной выше, но, к сожалению, ее нет в сети.Если вам интересно, я могу отправить его вам (или всем, кто заинтересован) по электронной почте.