c++ - 如果 x > y,用 y 交换 x 的无分支版本?
问题描述
假设x
和y
是有符号整数,是否有一些超级有效的实现技巧:
if (x < y) {
std::swap(x, y);
}
我可以立即想到一个解决方案c = x < y
,然后将其分配x
给c * x + (1 - c) * y
等,但这种方法会发出乘法指令,我想避免这种情况。有没有办法只用一点点摆弄来做到这一点?
编辑:只是澄清我真正关心的是试图摆脱由if
. 换句话说,我知道进行交换的 XOR 技巧,但这不是我要问的。
解决方案
我不确定,这是否加速了您的代码,但这是无分支解决方案:
#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);
}
推荐阅读
- aws-data-pipeline - 尽管将 3 小时设置为超时值,ShellCommandActivity 仍会超时
- javascript - 在函数中更改对象中的值
- python - 基于相邻行单元格值合并行
- r - 比较两个文件头并确保它们具有相同的头,无论顺序如何
- c# - SocketException:连接被您的主机软件中止
- hyperledger-fabric - 跟踪谁使用数字签名做了什么
- python-3.x - ANTLR4 grammar testing methods
- html - 有条件地在 React 中设置所有 html 标签的样式
- c++ - 具有多个指针初始值设定项的 C++ for 循环
- c# - 如何使用 newtonsoft 序列化 JSchema 中的依赖项