次のテストでは、両方のケースで同じ一連の数字が生成されます。
#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) を生成すべきではありませんか?