最近看深入理解计算机系统这本书时,在第二章有个练习题,在不生成中间变量的情况下,交换两个数。代码如下:
void swap(int *x, int *y) {
*y = *x ^ *y; /*Step 1*/
*x = *x ^ *y; /*Step 2*/
*y = *x ^ *y; /*Step 3*/
}
这个过程的效果是交换指针变量x和y所指向的存储位置处存放的值。这与通常的交换两个数值的方法不一样,当移动一个值时,我们不需要第三个位置来临时存储另一个值。不过,书上说这种方式并没有性能上的优势,这个就不太清楚了,按理说,程序运行过程中,节省了一部分存储空间,应该会有那么点优势的。不过,可能是生成一个临时变量的开销也是极小的,而且代码易读性较强,所以推荐使用。下面以一个表格的形式,来展现一下这个方法的执行过程(有关异或的内容可以参见前一篇博文:http://dsea.iteye.com/admin/blogs/1079580)(a^a = 0):
步骤 | *x | *y |
初始 | a | b |
第一步 | a | a^b |
第二步 | a^(a^b) | a^b |
第三步 | b | b^a^b = a |