我使用正向位扫描找出第一个设置位,之后我将该位复位为0.使用GCC和64位平台,我已经想出了这个:
uint64_t b = 0, cb = some random arbitrary data
asm("bsfq %0, %0" : "=r" (b) : "0" (cb));
// b now holds the index of first set bit.
cb &= cb - 1; // Reset the first bit.
我希望会有一些指令可以同时进行,但经过密集的谷歌搜索后,没有找到更有效的方法来做到这一点。那么,有吗?
答案 0 :(得分:0)
没有指令既重置最低设置位又获取其索引。但也有其他选择,其中一些可能比bsf\lea\and
更快。
例如,
bsf rax, rdi
btr rdi, rax
帮助英特尔(P4除外),但在AMD btr r,r
上需要两个周期,因此它与bsf\lea\and
的延迟相同。
其他例子,
tzcnt rax, rdi
blsr rdi, rdi
在英特尔,这并不差(但支持不太广泛)。在AMD上这很棒,在Jaguar上保存了5个疯狂的声音,因为bsf
非常慢。