试试这个,
int a = 128, ret = 0;
while (a) { ret++; a >>= 1; }
Run Code Online (Sandbox Code Playgroud)
要么,
int a = 128, ret = 0;
#define check(i) if ((-1 << i) & a) { ret += i; a >>= i; }
check (16)
check (8)
check (4)
check (2)
check (1)
Run Code Online (Sandbox Code Playgroud)
这是因为-1 == 0xffffffffff...又名无穷无尽的1弦.所以我基本上执行二进制搜索来定位最高设置位的索引.