骚操作!!!如何不使用临时变量,实现交换swap。
Posted Sherlock_ Holmes
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了骚操作!!!如何不使用临时变量,实现交换swap。相关的知识,希望对你有一定的参考价值。
一般,为了实现swap函数,我们会创建一个临时变量tmp
int tmp = a;
a = b;
b = tmp;
那么我们如何不使用临时变量来实现交换呢?
下面给出两种方法:
-
a = a + b;// a = a + b, b = a - b;// b = (a + b) - b = a; a = a - b;// a = (a + b) - a = b;
-
a = a ^ b;// a = a ^ b; b = a ^ b;// b = (a ^ b) ^ b = a ^ (b ^ b) = a ^ 0 = a; a = a ^ b;// a = (a ^ b) ^ a = b ^ (a ^ a) = b ^ 0 = b;
我们第一次见这两个骚操作可能会一脸懵B,下面解释下为什么可以这样做:
法一:理解一句话即可:“=” 右边的结果赋值给左边, 具体看注释即可。
法二:需要我们理解 ^ 异或,异或的骚操作可不少,具体后面可能会讲。
运算规则
相同为0,不同为1,即
1 ^ 1 = 0
0 ^ 0 = 0
1 ^ 0 = 1
由运算规则可知,任何二进制数与零异或,都会等于其本身,即A ^ 0 = A ,A ^ A = 0
异或性质
(1)交换律: A ^ B = B ^ A
(2)结合律: ( A ^ B ) ^ C = A ^ ( B ^ C )
(3)自反性: A ^ B ^ B = A (由结合律可推: A ^ B ^ B = A ^ ( B ^ B ) = A ^ 0 = A)
具体看注释即可。
以上是关于骚操作!!!如何不使用临时变量,实现交换swap。的主要内容,如果未能解决你的问题,请参考以下文章
linux(centos8): 临时关闭/永久关闭交换分区swap?
linux(centos8): 临时关闭/永久关闭交换分区swap?
a,b = b,在C ++中的python vs std :: swap()中