不使用临时变量交换两个数字

时间:2013-10-21 16:45:28

标签: c++ c

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

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

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

3 个答案:

答案 0 :(得分:14)

如何使用std libs? ;)

std::swap(a,b);

虽然您也可以使用XORing算法,但在真正需要之前不要使用它。

原因很清楚here: -

  

在现代CPU架构中,XOR技术要慢得多   而不是使用临时变量进行交换。一个原因是   现代CPU努力通过指令并行执行指令   管道。在XOR技术中,每个操作的输入都依赖于   关于前一个操作的结果,所以必须执行它们   严格按顺序排列。如果效率是一个巨大的问题,它   建议测试XOR技术和临时技术的速度   变量交换目标架构。

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

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

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

答案 1 :(得分:6)

解决方案是:

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

它的工作原理是因为x ^ x对于x的任何值等于0,因此,对于x和y的任何值,x ^ y ^ x(以任何顺序)等于y。虽然它不可能比仅使用临时更快(除非你为具有高寄存器争用且没有流水线技能的CPU进行编程)。

答案 2 :(得分:4)

尝试XORing,如下所示。

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