关于C语言两个变量之间数据交换的方法

C语言两个变量之间数据交换

方法总览

  1. 三杯水交换 (需要新变量)
  2. 和差交换 (不需要新变量)
  3. 三次异或 (不需要新变量)

三杯水交换

  • 将现有的两个变量当作盛有水的杯子,两个变量里的数据当作杯中的水。此时再申请一个变量当作空杯子,这样就有足够的空间来进行“水”的腾挪,即实现变量数据间的交换。
int a = 5;
int b = 7;
int c = 0;
//顺序不要错
c = a;			//c = 5
a = b;			//a = 7
b = c;			//b = 5
  • 上述中值得注意的是,a 中的数据并不会 随着“ c = a ”而消失,即并不是真的像水一样倒进了c中,而是将 a 中的数据复制了一份给了 c 。

和差交换

  • 主要是借助 a+b-a=b | a+b-b=a 的算术方法。
  • 这个方法在数据值较大的情况下是有漏洞的,因为变量所存储的数值大小是有范围的,而 “a = a+b ”这一步操作可能会导致 a 变量所存数值超出其存储数值的范围。
int a = 5;
int b = 7;
a = a+b;			//a = 5+7  =12
b = a-b;			//b = 12-7 = 5
a = a-b;			//a = 12-5 = 7

三次异或

异或的真值表
左操作数右操作数结果
110
101
011
000
异或的基本公式
首先要讲的是关于异或运算的一些基本公式。
	A ^ B = B ^ A
	A ^ ( B ^ C )  =  ( A ^ B ) ^ C
	A ^ A = 0
	A ^ 0 = A
于是我们可以得到:
	( B ^ A ) ^ B  =  ( A ^ B ) ^ B  
					=  A ^ ( B ^ B )  
					=  A 
异或就像是消消乐,会将相同数值的消为 0 ,而任何数与0异或都是其本身。
int a = 5;
int b = 7;
//为了方便理解 我会将 原a、b 标记为 a* 、 b*
a = a ^ b;		//a = a* ^ b*
b = a ^ b;		//b = ( a* ^ b* ) ^ b* = a*
a = a ^ b;		//a = ( a* ^ b* ) ^ b  = ( a* ^ b* ) ^ a* = b*


  a				0101
  b				0111	
a ^ b			0010
a ^ b ^ b		0101		a
a ^ b ^ a		0111		b

因为C语言中的 ^ 运算属于位运算,所以 “ a = a ^ b ” 并不会导致数据存储越界问题的发生。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值