Как найти двоичный логарифм очень быстро? (O (1) в лучшем случае)

Там какой-либо очень быстрый метод должен найти двоичный логарифм целого числа? Например, учитывая номер x=52656145834278593348959013841835216159447547700274555627155488768 такой алгоритм должен найти y=log (x, 2), который является 215. x всегда является питанием 2.

Проблема, кажется, действительно проста. Все, что требуется, должны найти положение старшего значащего 1 бита. Существует известный метод FloorLog, но это не очень быстро специально для очень длинных целых чисел из нескольких слов.

Каков самый быстрый метод?

14
задан psihodelia 19 April 2010 в 14:48
поделиться

4 ответа

Это Bit Twiddling Hacks то, что вы ищете?

23
ответ дан 1 December 2019 в 07:19
поделиться

Ответ зависит от реализации или языка. Любая реализация может хранить вместе с данными количество значащих битов, так как это часто бывает полезно. Если его необходимо вычислить, найдите в этом слове самое старшее слово / конечность и самый старший бит.

2
ответ дан 1 December 2019 в 07:19
поделиться

Если целые числа хранятся в uint32_t a [] , то мое очевидное решение будет следующим:

  1. Выполните линейный поиск по a [] , чтобы найти ненулевое uint32_t значение с наибольшим значением a [i ] в a [] (проверьте, используя uint64_t для этого поиска, если на вашем компьютере есть собственная поддержка uint64_t )

  2. Примените бит твидл-хаки для нахождения двоичного журнала b значения uint32_t a [i] , найденного на шаге 1.

  3. Вычислить 32 * i + b .

4
ответ дан 1 December 2019 в 07:19
поделиться

Быстрый прием: Большинство представлений чисел с плавающей запятой автоматически нормализуют значения, что означает, что они эффективно выполняют цикл Упомянутый Кристоффером Хаммарстремом аппаратно. Таким образом, простое преобразование из целого числа в FP и извлечение экспоненты должно помочь, если числа находятся в пределах диапазона экспоненты FP-представления! (В вашем случае для ввода целого числа требуется несколько машинных слов, поэтому при преобразовании потребуется выполнить несколько «сдвигов».)

7
ответ дан 1 December 2019 в 07:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: