Как найти младший установленный бит без цикла

Как найти младший установленный бит без цикла

Этот трюк возвращает позицию самого правого бита 1 в 32-битном числе:

static const int table[32] = {

0, 1, 28, 2, 29, 14, 24, 3,

30, 22, 20, 15, 25, 17, 4, 8,

31, 27, 13, 23, 21, 19, 16, 7,

26, 12, 18, 6, 11, 5, 10, 9

};

int lowest_set_bit(uint32_t v)

{

return table[((v & -v) * 0x077CB531U) >> 27];

}

Выражение v & -v изолирует младший установленный бит.

Затем результат умножается на константу 0x077CB531 из последовательности де Брёйна. Для каждой из 32 возможных позиций старшие 5 бит произведения образуют уникальный индекс.

Остаётся одно обращение к таблице - и позиция найдена без перебора всех битов.

Важно: функция рассчитана на v != 0.

В современном коде также стоит проверить std::countr_zero() или __builtin_ctz() - компилятор часто превращает их в одну инструкцию процессора.

3