1

次のテストでは、両方のケースで同じ一連の数字が生成されます。

#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) を生成すべきではありませんか?

4

1 に答える 1

3

いいえ。ソースにビットが 1 つしか設定されていない場合、これは正常な動作です。結果があまり役に立たないと思うような場合。同じゼロベースのインデックスを提供するため、どちらのビットが両方のコマンドを意味するかは明らかです。

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

唯一の違いは検索方向ですが、コマンドはインデックスを変換します。

于 2012-12-12T09:59:11.697 に答える