异或运算可以达到交换两数的目的 代码如下:

void swap(int &a, int &b){  a = a^b;  b = a^b;  a = a^b;}

但不推荐使用这种方式 附上常用的临时变量方法对比说明。

临时变量方法:

void swap(int &a, int &b){  int tmp = a;  a = b;  b = tmp;}

对于临时变量法 每次赋值只要读取一个变量的值到寄存器 然后再从寄存器写回到另一个变量中即可 前后涉及两次内存写入操作;但是对于异或运算操作 每次都需要读取两个数据到寄存器中 再进行运算操作 之后把结果写回到变量中 前后共需要三次内存写入操作。另外一点 异或操作的代码可读性差。

如果使用C语言实现上述两种方法 并用gcc编译器编译 可以使用命令 gcc -S swap.c 查看相应的汇编代码 临时变量法代码行数更少 另外使用 gcc 编译器时 用异或运算交换数组会出错 参见链接。

在不引入临时变量的基础上 交换两数的值还可以使用三次加减法 代码如下:

void swap(int &a, int &b){    a = a + b;    b = a - b;    a = a - b;}

这种方式同样需要三次内存写入操作 同时代码可读性也较差。

最后附上两张三种方法编译后对应汇编代码对比图(平台:Ubuntu14.04 gcc 4.8.4) 图中 swap1.c 文件对应临时变量法 swap2.c 文件对应加减方法 swap3.c 文件对应异或方法。可以看到 临时变量法编译出的汇编代码量最少即效率更高 加减法和异或方法的区别仅仅是计算方式不同而已 操作步骤是一致的。

图1: 临时变量法和加减法汇编代码对比 点击图片查看大图。

swap_cmp-.png

图2: 异或方法和加减法汇编代码对比 点击图片查看大图。

swap_cmp2-.png