bsr和bsf产生相同的结果

时间:2012-12-12 09:28:30

标签: assembly x86

以下测试在两种情况下都会产生相同的数字序列:

#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)?

1 个答案:

答案 0 :(得分:2)

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

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

唯一的区别是搜索方向,但命令会为您转换索引。