如果x> y,将x与y交换的无分支版本?

del*_*del 6 c++ optimization c++11

假设xy是有符号整数,是否有一些实现的超级有效技巧:

if (x < y) {
    std::swap(x, y);
}
Run Code Online (Sandbox Code Playgroud)

我可以立即想到使用的解决方案c = x < y,然后再分配xc * x + (1 - c) * yetc。但是这种方法会发出乘法指令,我想避免这种情况。有办法单独摆弄吗?

编辑:只是澄清一下,我真正关心的是试图摆脱引起的分支if。换句话说,我知道进行交换的XOR技巧,但这不是我要的。

ole*_*rch 5

我不确定,这是加速您的代码,但这是无分支解决方案:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv) {
  int a = atoi(argv[1]);
  int b = atoi(argv[2]);
  int c = a - b;
  c &= c >> 31; // SXT for signed int
  a -= c;
  b += c;
  printf("Result: %d %d\n", a, b);
}
Run Code Online (Sandbox Code Playgroud)

  • 它不仅仅是大约 31 或 8(`CHAR_BIT`)。这也是关于负值。你可能需要 `-(c &lt; 0)` 而不是 `c &gt;&gt; 31`。并且整个代码仍然依赖于 2 的补码表示。 (3认同)
  • `&gt;&gt; 31` 调用实现定义的行为,不是吗? (2认同)