不生成中间变量,交换两个数

最近看深入理解计算机系统这本书时,在第二章有个练习题,在不生成中间变量的情况下,交换两个数。代码如下:

 

 

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

 

你可能感兴趣的:(变量)