一、定义
异或,英文为exclusive OR,缩写成xor。
异或(xor)是一个数学运算符。它应用于逻辑运算。异或的数学符号为“⊕”,计算机符号为“xor”。其运算法则为:
a⊕b = (¬a ∧ b) ∨ (a ∧¬b)
如果a、b两个值不相同,则异或结果为1。如果a、b两个值相同,异或结果为0。
!!!注意!!!——-是用
二进制
算的
二、运算法则
-
归零律:
a ⊕ a = 0
, 任何数与本身异或,结果均为0。 -
恒等律:
a ⊕ 0 = a
,任何数与0异或,结果均为本身。 -
交换律:
a ⊕ b = b ⊕ a
-
结合律:
a ⊕b ⊕ c = a ⊕ (b ⊕ c) = (a ⊕ b) ⊕ c
-
自反:
a ⊕ b ⊕ a = b
-
d =
a ⊕ b ⊕ c
可以推出
a = d ⊕ b ⊕ c
-
若x是二进制数0101,y是二进制数1011;则x⊕y=1110。
只有在两个比较的位不同时其结果是1,否则结果为0
即“两个输入相同时为0,不同则为1”!
三、应用
1.只出现一次的数字
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
def single_number(nums: list) -> int:
a = 0
for n in nums:
a = a ^ n
return a
时间复杂度O(n)
空间复杂度O(1)
解析:
遍历数组中的每一个元素,将所有元素进行异或运算,最终得到的结果就是只出现过一次的元素。这是因为,对于出现了两次的元素,它们在异或运算后会抵消掉;而只出现了一次的元素,由于没有配对的元素,所以它们的值会被保留下来。参考运算法则归零律,恒等律。
2. a和b不通过第三个变量来交换值
除了python中常用的 a,b=b,a之外,可以用异或:
a = 2
b = 5
a = a ^ b
b = a ^ b
a = a ^ b
解析:
(1)a =a^b; 这里 2的二进制是 0010, 5的二进制是 0101,结果是 0111,这个数是7。这里把7赋值给a。
(2)b=a^b;这里 a=7,b还是5。在做异或运算 0111 和0101 运算的结果是0010,转换成十进制就是2。
(3)a=a^b;这里 a=7,b=2. 在做异或 0111 和 0010 运算结果是0101,,转换成十进制就是5。