У меня есть решение.Это не быстро.Он рассчитывает количество необходимых битов, то есть 32 для 0xFFFFFFFF и 0 для 0x00000000.Обратите внимание, что ваш код C действительно вычисляет старший значащий бит или ноль.
Вот оно:
#define ISSET(x,i) (((x) >> (i)) & 1)
#define FILL(x) (-(x))
#define IF(x,y,z) ((FILL(x) & y) | (~FILL(x) & z))
#define R(x,i,y,z) (IF(ISSET(x,i),y,z))
int log2 (uint32_t x)
{
return R(x,31,32,
R(x,30,31,
R(x,29,30,
R(x,28,29,
R(x,27,28,
R(x,26,27,
R(x,25,26,
R(x,24,25,
R(x,23,24,
R(x,22,23,
R(x,21,22,
R(x,20,21,
R(x,19,20,
R(x,18,19,
R(x,17,18,
R(x,16,17,
R(x,15,16,
R(x,14,15,
R(x,13,14,
R(x,12,13,
R(x,11,12,
R(x,10,11,
R(x, 9,10,
R(x, 8, 9,
R(x, 7, 8,
R(x, 6, 7,
R(x, 5, 6,
R(x, 4, 5,
R(x, 3, 4,
R(x, 2, 3,
R(x, 1, 2,
R(x, 0, 1, 0))))))))))))))))))))))))))))))));
}
Примечание. Общий принцип можно использовать для других функций.