Что такое быстрый способ вычисления (long int) ceiling(log_2(i))
, где ввод и вывод являются 64-битными целыми числами? Решения для подписанных или беззнаковых целых чисел приемлемы. Я подозреваю, что наилучшим способом будет метод бит-twiddling, подобный найденному здесь, но вместо того, чтобы пытаться самостоятельно, я хотел бы использовать что-то, что уже хорошо протестирован. Общее решение будет работать для всех положительных значений.
Например, значения для 2,3,4,5,6,7,8 составляют 1,2,2,3,3,3,3
Изменить: пока лучший маршрут, по-видимому, состоит в том, чтобы вычислить базовую базу 2-го числа/пол (позицию MSB) с использованием любого количества быстрых существующих битаков или методов регистрации, а затем добавить один, если вход не является сила двух. Быстрая побитовая проверка для степеней двух составляет (n&(n-1))
.
Редактировать 2: Хороший источник для целочисленных логарифмов и ведущих методов нулей - это разделы 5-3 и 11-4 в Hacker Delight от Henry S Уоррен. Это наиболее полное лечение, которое я нашел.