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

本文介绍了一种使用异或运算实现的两数交换方法,该方法无需额外变量,通过三个步骤完成值的交换,并分析了其实际应用效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

 

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
第一步aa^b
第二步a^(a^b)a^b
 第三步bb^a^b = a

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值