1
以下测试产生相同的数字序列中的这两种情况下:BSR和BSF产生相同的结果
#include <iostream>
#define BIT_SCAN_IFZERO 0
inline size_t bsr(size_t input) {
size_t pos, ifzero = BIT_SCAN_IFZERO;
__asm
{
bsr eax, input
cmovz eax,ifzero
mov pos,eax
};
return pos;
}
inline size_t bsf(size_t input) {
size_t pos, ifzero = BIT_SCAN_IFZERO;
__asm
{
bsf eax, input
cmovz eax,ifzero
mov pos,eax
};
return pos;
}
int main()
{
size_t value = 1;
for(int i=0;i<32;++i)
{
std::cout<<bsf(value)<<",";
value<<=1;
}
std::cout<<std::endl;
value = 1;
for(int i=0;i<32;++i)
{
std::cout<<bsr(value)<<",";
value<<=1;
}
return 0;
}
在两种情况下,0到31被印刷在同一序列中。
不应该bsf(x)产生32-bsr(x)?
哦,所以我可以根据输入数据的分布选择合适的一个,因为一个可能比另一个更快? – TravisG
BSF和BSR与80386一起推出。这是一个典型的CISC(复杂指令集芯片)体系结构,这些命令适合于这种情况。说实话,我从来没有使用过这个指令,但我猜他们很慢。当然,这取决于在不同的x86 CPU内核(微码,硬编码)中执行此命令。你可以做一些测试来发现它。 –
谢谢。另一个问题,但:有没有一种快速的方法来找到从MSB开始的第一组比特? – TravisG