对于无符号整数,得到的结果

if (a>b) => 1
if (a=b) => 0
if (a<b) => -1


可以优化到无分支版本

return ((a > b) - (a < b))


可以这样将其写入x86程序集中:

4829D1           cmp rcx,rdx
0F94C1           setz cl
19C0             sbb eax,eax
83D8FF           sbb eax,-$01
D3E8             shr eax,cl

13 bytes in total


有没有一种方法可以在少于5条指令或更少字节的情况下不进行分支?

最佳答案

一个更少的字节(11个字节)和一个更少的指令(4个指令)的解决方案,可能更快:

483bca          cmp     rcx,rdx
1bc0            sbb     eax,eax
483bd1          cmp     rdx,rcx
83d000          adc     eax,0


如果您有一个已知为空的备用寄存器,则可以将其提高到10个字节。

...
11d8            adc     eax,ebx

07-24 09:45
查看更多