我正在使用Visual Studio 2010专业版,我刚刚在调试模式下检查过BSF无法正常工作我尝试了很多组合,但没有一个能够工作!
__asm
{
mov ebx, 0ffffffh;
bsf ecx, ebx;
};
上面的代码至少给了我一些结果,但我在ecx寄存器上得到0(我使用的是64位win7,应用程序是32位)
以下是英特尔关于BSF的说法:
搜索源操作数(第二个 操作数)用于最不重要的集合 位(1位)。如果最不重要1 找到位,存储其位索引 在目标操作数中(第一个 操作数)。源操作数可以是a 寄存器或存储位置;该 目标操作数是一个寄存器。该 位索引是一个无符号偏移量 源操作数的第0位。如果 源操作数的内容为0, 目标操作数的内容 未定义。
有人有什么想法吗?谢谢大家...
答案 0 :(得分:15)
您将ecx
设置为0,因为值0xffffff
中的最低有效(最少?)1位是位0.该二进制数为是0000 .... 1111 1111 1111 1111 1111 1111
。
换句话说,您看到的结果是正确的。
如果您在0xfc
上尝试(例如二进制1111 1100
),则应该得到2.这是因为最低有效位位于二进制数的最右侧位置:
Hex F C
Binary 1111 1100
Bit# 7654 3210
^
|
+-- rightmost (least significant) 1-bit
答案 1 :(得分:4)
不要使用内联asm,请使用编译器内在函数:_BitScanForward