【发布时间】:2010-12-01 11:18:45
【问题描述】:
我想找到最快的方法来获取 long long 的最低位的索引。即:
00101001001000 -> 3
涉及循环和移位的解决方案太慢了。即:
int i;
if(bits == 0ULL) {
i = 64;
} else {
for(i = 0;!(bits & 1ULL);i++)
bits >>= 1;
}
编辑:使用信息
使用 ffsll 的函数并不能真正减少它的使用量,但是在这里(当然是简化了)。它只是遍历索引并对它们做一些事情。这个函数可能是我整个应用程序中使用最广泛的函数,尽管它的值有很多缓存。这是我的 alpha-beta 搜索引擎中的合法移动生成器。
while(bits){
index = ffsll(bits);
doSomething(index);
index &= index-1;
}
【问题讨论】:
-
“太慢”是什么意思?它占整个运行时间的百分之几?
-
这段代码在我的基准测试中运行时间为 7.2 秒,而 ffsll 运行时间为 0.2 秒。减少了 97%。太慢了;)