旧文新说:在不使用临时变量的情况下交换两个变量的值——异或运算详细介绍
前情提要:之前在旧的博客站上发布过一些文章,突然在WordPress上找到了缓存,这里做一些搬运、纠正和评论
RT,以Python为例,为大家提供两种方式并重点讲解异或运算的原理、性质及应用
方式一:加减法(这并不是重头戏)
为了不使用临时变量,我们可以考虑把所有的数据储存到一个变量中来空出一个变量来进行交换。自然而然的就可以想到加法
假设变量a的值为x,b的值为y,我们来体验一下:
step1: 令a的值变为a+b,即a=x+y
step2: 令b的值变为a-b,即b=(x+y)-y=x 注:此时已完成将a变量的值转移到b
step3: 同样令a的值变为a-b, 即a=(x+y)-x=y 注:完成交换
Python3代码实现:
num1=10
num2=20
num1=num1+num2
num2=num1-num2
num1-=num2
print(num1, num2)
输出: 20 10
是不是非常的轻松+愉快?同样的,基于以上这种逻辑,我们甚至可以使用减法和乘法等来实现。但是这种计算方式可能引起数据溢出,在某些语言中会报错(当然是可以规避的,如在C#中使用unchecked代码块)。在这里我为大家提供第二种解决方案。
方法二:异或运算
在讲这个方法前让我先来给大家介绍一下异或运算(XOR)的原理:
异或运算()XOR对应的按位操作符为“^”,用于处理二进制数据,对两值进行处理,一下为异或运算表:
左操作数 | 右操作数 | 运算结果 |
1 | 1 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
0 | 0 | 0 |
由此可以清晰的看到,当给出的两个二进制值相等不相等时异或运算结果为1(可也理解为true),反之运算结果为0。接下来我们来详细的解析一下异或运算符是如何对两个整数进行运算的:
这里以5^6为例
5的二进制值为101,6为110,我们用列表来表示它们:
第一位 | 第二位 | 第三位 | |
5 | 1 | 0 | 1 |
6 | 1 | 1 | 0 |
运算结果 | 0 | 1 | 1 |
基于异或运算的性质,我们可以知道,异或运算是可逆的,这个逻辑不难理解,你可以自己画几个异或运算表来尝试一下,多试几次就能理解它的可逆性了。
举个?:
可以发现,异或运算的原值和运算结果总是在三个数中间套娃,比如3、5、6这三个数无论取哪两个数进行异或运算总会得到另一个数字。利用这个原理我们就能用异或运算来交换变量了,这里就已交换3、5为例来介绍吧:
注:假设变量a为3,变量b为5
令a=a^b,即a=3^5=6
令b=a^b,即b=6^5=3 注:此时已完成将a变量的值转移到b
令a=a^b,即a=6^3=5 注:完成交换
这就利用了异或运算的可逆性完成了变量的交换
Python3代码实现:
num1=10
num2=20
num1=num1^num2
num2=num1^num2
num1=num1^num2
print(num1, num2)
输出: 20 10
同样的效果,同样的轻松愉快。大?们学会了吗(つД`)ノ
结语:
非常感谢你能阅读到这里~欢迎订阅本站的rss频道,持续更新有趣的技术新文章!
PS:唔,其实废话挺多的,毕竟这种文章完全是面向新新手的。不得不说WordPress的区块编辑器用惯了以后相比markdown有了不小的灵活度。
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。