C语言两个变量之间数据交换
方法总览
- 三杯水交换 (需要新变量)
- 和差交换 (不需要新变量)
- 三次异或 (不需要新变量)
三杯水交换
- 将现有的两个变量当作盛有水的杯子,两个变量里的数据当作杯中的水。此时再申请一个变量当作空杯子,这样就有足够的空间来进行“水”的腾挪,即实现变量数据间的交换。
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
三次异或
异或的真值表
左操作数 | 右操作数 | 结果 |
---|---|---|
1 | 1 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
0 | 0 | 0 |
异或的基本公式
首先要讲的是关于异或运算的一些基本公式。
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 ” 并不会导致数据存储越界问题的发生。