首页 二进制的异或运算
文章
取消

二进制的异或运算

说明

异或是两个数值的运算,只要两者不同,结果就为1,否则结果为0。

aba^b
110
101
000
011

应用示例

判断两值相等

一个数和自身做异或运算,结果是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]

可利用此性质消掉 35

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
本文由作者按照 CC BY 4.0 进行授权