异或运算解析

  • Post author:
  • Post category:其他




一、定义

异或,英文为exclusive OR,缩写成xor。

异或(xor)是一个数学运算符。它应用于逻辑运算。异或的数学符号为“⊕”,计算机符号为“xor”。其运算法则为:

a⊕b = (¬a ∧ b) ∨ (a ∧¬b)


如果a、b两个值不相同,则异或结果为1。如果a、b两个值相同,异或结果为0。

!!!注意!!!——-是用

二进制

算的



二、运算法则

  1. 归零律:

    a ⊕ a = 0

    , 任何数与本身异或,结果均为0。
  2. 恒等律:

    a ⊕ 0 = a

    ,任何数与0异或,结果均为本身。
  3. 交换律:

    a ⊕ b = b ⊕ a
  4. 结合律:

    a ⊕b ⊕ c = a ⊕ (b ⊕ c) = (a ⊕ b) ⊕ c
  5. 自反:

    a ⊕ b ⊕ a = b
  6. d =

    a ⊕ b ⊕ c

    可以推出

    a = d ⊕ b ⊕ c
  7. 若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。



版权声明:本文为qq_38669698原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。