Какое лучшее решение для получения логарифма по основанию 2 числа, которое, как я знаю, является степенью двойки (2^k
). (Конечно, я знаю только значение 2^k
, а не само k
.)
Один из способов, который я придумал, - это вычесть 1, а затем выполнить подсчет битов:
lg2(n) = bitcount( n - 1 ) = k, iff k is an integer
0b10000 - 1 = 0b01111, bitcount(0b01111) = 4
Но есть ли более быстрый способ сделать это (без кэширования)? Также было бы неплохо узнать что-то, что не связано с битрейтом так же быстро?
Одно из приложений это:
suppose you have bitmask
0b0110111000
and value
0b0101010101
and you are interested of
(value & bitmask) >> number of zeros in front of bitmask
(0b0101010101 & 0b0110111000) >> 3 = 0b100010
this can be done with
using bitcount
value & bitmask >> bitcount((bitmask - 1) xor bitmask) - 1
or using lg2
value & bitmask >> lg2(((bitmask - 1) xor bitmask) + 1 ) - 2
Чтобы он был быстрее, чем bitcount без кэширования это должно быть быстрее, чем O(lg(k))
, где k
— количество бит памяти.