Какой самый быстрый способ выполнить следующее побитовое преобразование?
X..XA01..1 // input
X..X011..1 // output
Таким образом, младший значащий нулевой бит должен быть установлен в единицу, а оставленный ему бит (независимо от того, равен он нулю или единице) должен быть установлен в ноль, и все.
Получить самый правый ноль легко: ~x & (x + 1)
Используя это, вы можете сделать это за пару простых шагов: (не проверено)
uint32_t rightmost_zero = ~x & (x + 1);
uint32_t result = (x | rightmost_zero) & ~(rightmost_zero << 1);
Там может быть более простой / быстрый способ.
Других решений пока нет …