首页 > 解决方案 > 如果 x > y,用 y 交换 x 的无分支版本?

问题描述

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

if (x < y) {
    std::swap(x, y);
}

我可以立即想到一个解决方案c = x < y,然后将其分配xc * x + (1 - c) * y等,但这种方法会发出乘法指令,我想避免这种情况。有没有办法只用一点点摆弄来做到这一点?

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

标签: c++c++11optimization

解决方案


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

#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);
}

推荐阅读