Вычисление floor(log_2(x))
можно выполнить, подсчитав количество нулей, для которых существует the-highest-set-bit-msb-in-i">множество быстрых алгоритмов.
Существуют ли какие-либо аналогичные приемы для вычисления floor(log_{2^(1/4)}(x))
, когда x
является 64-битным целым числом без знака, охватывающим все возможные значения?
Поскольку log_{2^(1/4)}(x)=4*log_2(x)=log_2(x^4)
, это было бы эквивалентно поиску эффективного алгоритма для floor(4*log_2(x))
или floor(log(x^4))
.
floor(4*log_2(x))
из-за ошибок округления для большихx
. С точки зрения производительности, прямой перевод на Go не дает такой большой разницы в производительности, как я ожидал. Для случайных, равномерно распределенных значений uint64 я сравниваю54.7ns/op
для наивного подхода и19.8ns/op
для описанного выше. Одна только расчетная частьlog_2
соответствует7.9ns/op
. 29.08.2014