2012-12-12 97 views
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)?

回答

2

否。如果源中只设置了一个位,则这是正常行为。如果它会像你认为结果不会很有用。 因为它为您提供了相同的基于零的索引,所以清楚哪个位适用于这两个命令。

http://courses.engr.illinois.edu/ece390/archive/spr2002/books/labmanual/inst-ref-bsf.html

唯一的区别就是搜索方向,但该命令将改变索引你。

+0

哦,所以我可以根据输入数据的分布选择合适的一个,因为一个可能比另一个更快? – TravisG

+0

BSF和BSR与80386一起推出。这是一个典型的CISC(复杂指令集芯片)体系结构,这些命令适合于这种情况。说实话,我从来没有使用过这个指令,但我猜他们很慢。当然,这取决于在不同的x86 CPU内核(微码,硬编码)中执行此命令。你可以做一些测试来发现它。 –

+0

谢谢。另一个问题,但:有没有一种快速的方法来找到从MSB开始的第一组比特? – TravisG

相关问题