Que*_*ous 3 binary x86 assembly bit-manipulation bit
我正在编写一个 x86 汇编程序,我想检查一个寄存器(它不是 0),看看是否有多个位打开。
有没有一种简单的方法可以做到这一点,或者我应该循环并移动直到看到第二组位或到达末尾?
我不需要设置位的总数,那就是
有没有比执行其中一项并检查更快的方法popcnt(x) > 1?
正如ecm几乎评论的那样,可以通过检查来检查一个值是否是 2 的幂
a) value != 0 &&
b) ((value - 1) & value) == 0
Run Code Online (Sandbox Code Playgroud)
然而,如果需要检查一个值是否超过 1 位,那么测试一下就足够了
c) ((value - 1) & value) != 0
lea ebx, [eax - 1]
test eax, ebx ; // Z flag is cleared on EAX having 2 or more bits
Run Code Online (Sandbox Code Playgroud)
也就是说:如果某个位(最初设置的位)被清除后值非零,则它必须设置了超过 1 个位。
BMI1 扩展有一条指令:清除最低有效位blsr,它也会相应地设置 ZF。