假设我有一个 32 位或 64 位无符号整数。
找到最左边位的索引 i 以使最左边 i 位中 0 的数量等于最左边 i 位中 1 的数量的最快方法是什么?我在想一些小技巧,就像这里提到的那样。
我对最近的 x86_64 处理器感兴趣。这可能与某些处理器支持指令有关,例如 POPCNT(计算 1 的数量)或 LZCNT(计算前导 0 的数量)。
如果有帮助,可以假设第一位始终具有某个值。
示例(16 位):如果整数是
1110010100110110b
^
i
那么 i=10 对应标记的位置。
16 位整数的可能(慢)实现可能是:
mask = 1000000000000000b
pos = 0
count=0
do {
if(x & mask)
count++;
else
count--;
pos++;
x<<=1;
} while(count)
return pos;
编辑:根据@njuffa 评论修复了代码中的错误。