Незначительное улучшение ответа Гуффы ... Поскольку сумма, которую вы добавляете к результату, всегда равна степени двух, использование битовых операций может привести к небольшому улучшению в некоторых архитектурах.Кроме того, поскольку наш контекст является битовым шаблоном, он немного более удобен для использования в шестнадцатеричном формате.В этом случае полезно сдвинуть арифметику на степень 2.
int bits = 0;
if (n > 0xffff) {
n >>= 16;
bits = 0x10;
}
if (n > 0xff) {
n >>= 8;
bits |= 0x8;
}
if (n > 0xf) {
n >>= 4;
bits |= 0x4;
}
if (n > 0x3) {
n >>= 2;
bits |= 0x2;
}
if (n > 0x1) {
bits |= 0x1;
}
Далее следует добавить проверку для n == 0, поскольку приведенное выше даст результат 0 и Log (0).не определено (независимо от базы).
В сборке ARM этот алгоритм создает очень компактный код, так как ветвь после сравнения может быть устранена с помощью условных инструкций, позволяющих избежать очистки конвейера.Например:
if (n > 0xff) {
n >>= 8;
bits |= 0x8;
}
становится (пусть R0 = n, R1 = биты)
CMP R0, $0xff
MOVHI R0, R0, LSR $8
ORRHI R1, R1, $0x8