1

我找到了这个常见的解决方案:-

int a=10, b=20;    
a=a+b;
b=a-b;
a=a-b;

但是如果 a=2147483647 是一个整数的最大值,那么可能 a=a+b 是不可行的。

4

3 回答 3

14

使用标准库怎么样?;)

std::swap(a,b);

尽管您也可以使用 XORing 算法,但除非您真的需要,否则不要使用它。

原因在这里得到了很好的解释:-

在现代 CPU 架构上,XOR 技术比使用临时变量进行交换要慢得多。原因之一是现代 CPU 努力通过指令流水线并行执行指令。在 XOR 技术中,每个操作的输入取决于前一个操作的结果,因此它们必须严格按顺序执行。如果效率非常重要,建议在目标架构上测试 XOR 技术和临时变量交换的速度。

虽然为时已晚,但由于您没有提到是否要构建函数,因此该swap方法是最简单的方法。

但是,您也可以尝试使用 XOR 方法(尽管请查看上面关于其性能的参考),如下所示:

a ^= b;
b ^= a;
a ^= b;
于 2013-10-21T16:50:37.157 回答
6

解决方案是:

a ^= b;
b ^= a;
a ^= b;

它之所以有效,是因为x ^ x对于 x 的任何值都等于 0,因此x ^ y ^ x(以任何顺序)对于 x 和 y 的任何值都等于 y。不过,它不太可能比仅使用临时更快(除非您正在为具有高寄存器争用且没有流水线能力的 CPU 进行编程)。

于 2013-10-21T16:48:25.807 回答
4

尝试如下异或。

a ^= b;
b ^= a;
a ^= b;
于 2013-10-21T16:48:47.333 回答