sao*_*lof 1 x86 assembly bit-manipulation ones-complement gray-code
计算二进制补码绝对值的最快方法是一种足够常见的操作,优化的实现已广泛使用。那么让我们考虑另一种情况。如果我们想使用 x86 汇编获取补码的绝对值怎么办?
我拥有的一个快速但可能不是最理想的无分支实现是通过与 10000.... 掩码和移位来获取符号位,将其与 11111... 掩码相乘,然后将其与原始数字进行异或。但有更好的方法吗?
出现这种情况的一个应用是格雷解码的最佳实现。64 位整数的格雷解码的常见实现使用六个异或运算和六个位移位。然而,数字与......1111110 的无进位乘法将给出格雷解码或其按位求反,并取其补码abs 值给出格雷解码。只要可以进行微优化,它就应该比最普遍的方法更快。出于该问题的目的,起始状态可以假定为任何标准 C 调用约定或 CLMUL 操作之后(采用非进位输出)。
通过与 10000... 掩码进行 ANDING 并移位,将其与 11111... 掩码相乘
符号掩码可以通过算术右移来计算:
mov edx, eax
sar eax, 31 ; <- compute the sign mask
xor eax, edx
Run Code Online (Sandbox Code Playgroud)
至于解码格雷码,还有其他依赖现代指令的技巧