Самый быстрый в C - это почти всегда справочные таблицы за счет использования памяти.Предполагая, что значение всегда равно степени 2, вы можете создать справочную таблицу следующим образом:
uint8_t get_exponent (uint8_t val)
{
static const uint8_t byte[256] =
{
[1] = 0,
[2] = 1,
[4] = 2,
[8] = 3,
[16] = 4,
[32] = 5,
[64] = 6,
[128] = 7,
};
return byte[val & 0xFF];
}
Она вернет 0, если вы передадите значение, не являющееся степенью 2.
Это может быть расширено либо путем циклического прохождения, например, 4 байтов uint32_t и выполнения 4 операций поиска в таблице.Или, сделав еще большие справочные таблицы.
На x86 я получаю вышеперечисленное, чтобы сводиться к этому крошечному машинному коду без веток:
get_exponent:
movzx edi, dil
movzx eax, BYTE PTR byte.2173[rdi]
ret
(Переключение на uint_fast8_t
дает идентичный код в этом случае.)