对于无符号整数,得到的结果
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