Как сдвинуть влево наименее значимый ноль?

Какой самый быстрый способ выполнить следующее побитовое преобразование?

X..XA01..1 // input
X..X011..1 // output

Таким образом, младший значащий нулевой бит должен быть установлен в единицу, а оставленный ему бит (независимо от того, равен он нулю или единице) должен быть установлен в ноль, и все.

0

Решение

Получить самый правый ноль легко: ~x & (x + 1)

Используя это, вы можете сделать это за пару простых шагов: (не проверено)

uint32_t rightmost_zero = ~x & (x + 1);
uint32_t result = (x | rightmost_zero) & ~(rightmost_zero << 1);

Там может быть более простой / быстрый способ.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]