【发布时间】:2017-04-17 10:18:39
【问题描述】:
假设我有一个 32 位或 64 位无符号整数。
找到最左边位的索引 i 以使最左边 i 位中 0 的数量等于最左边 i 位中 1 的数量的最快方法是什么? 我在想一些像here 提到的小技巧。
我对最近的 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 评论修复代码中的错误。
【问题讨论】:
-
而
i = 0会被封禁,对吧?不然有点无聊 -
确实是的 :) 我必须在 1,...,size 范围内,其中 size 是整数的位数。
-
我不清楚规范。您能否提供一个简单(缓慢)的参考实现来说明您的想法?在我看来,这样一个最左边的位位置并不总是可以找到,一个简单的 32 位示例是 0xFFFFFFFE(或者在这种情况下结果是 32?)
-
你可以假设这样的位置一直存在。换句话说,如果这样的位置不存在,任何结果都可以。参考原帖中的实现。
-
@Steven 根据您的文字描述,参考代码不应返回
count,而是返回count == 0之前遍历的位数。
标签: binary bit-manipulation x86-64 bit iec10967