快速高效的位扫描正向和复位

时间:2015-07-27 07:25:40

标签: gcc bit-manipulation

我使用正向位扫描找出第一个设置位,之后我将该位复位为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.

我希望会有一些指令可以同时进行,但经过密集的谷歌搜索后,没有找到更有效的方法来做到这一点。那么,有吗?

1 个答案:

答案 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非常慢。