说明
异或是两个数值的运算,只要两者不同,结果就为1,否则结果为0。
a | b | a^b |
---|---|---|
1 | 1 | 0 |
1 | 0 | 1 |
0 | 0 | 0 |
0 | 1 | 1 |
应用示例
判断两值相等
一个数和自身做异或运算,结果是0。
我们以124作为例子:
1
2
3
4
1111100 # 124
^
1111100 # 124
0000000 # 异或结果
交换两个整数变量的值
假设 a=3,b=7
1
2
3
a^=b # a=0011^0111=0100=4
b^=a # b=0111^0100=0011=3
a^=b # a=0100^0011=0111=7
最终实现了两个值互换 ,这种方式可以不使用临时变量,节约内存。
去除相同的两个数字
一个数和0做异或运算,结果还是自身。
假设一个数组内,有一个只出现一次的数字,其他都出现了偶数次,如 [1,3,5,3,5,5,5]
。
可利用此性质消掉 3
和 5
。
1
2
3
4
5
6
7
1^3^5^3^5^5^5
= 2^5^3^5^5^5
= 7^3^5^5^5
= 4^5^5^5
= 1^5^5
= 4^5
= 1 # 1 即为结果
其实上面的运算顺序可调整为
1
2
3
(3^3)^(5^5)^(5^5)^1
=0^0^0^1
=1
判断两个整数是否异号
对于都不为0的整数 a 和 b,若有 a^b<0
则 a 与 b 异号;若有 a^b>0
则 a 与 b 同号。
1
2
3
4
>>> 1^-3<0
True
>>> 1^3>0
True
这种方法利用了补码编码的符号位。
对整数加减1
对于整数 a 加1,可以使用 -~a
:
1
2
3
4
>>> -~10
11
>>> -~(-10)
-9
对于整数 a 减1,可以使用 ~-a
:
1
2
3
4
>>> ~-10
9
>>> ~-(-10)
-11