^ (XOR) 运算符是做什么用的?

91

XOR执行什么数学运算?


1
XOR是一种逻辑运算,而不是数学运算。 - Marcin Orlowski
6个回答

162

XOR是一种二进制运算,代表“异或”,即如果只有 一个 位被设置,则结果位将评估为1。

这是它的函数表:

a | b | a ^ b
--|---|------
0 | 0 | 0
0 | 1 | 1
1 | 0 | 1
1 | 1 | 0

这个操作是在一个数字的每两个对应的二进制位之间执行的。

例如:7 ^ 10
二进制形式:0111 ^ 1010

  0111
^ 1010
======
  1101 = 13

属性:该操作是可交换的,可结合的和自反的。

它也相当于模2加法。


3
谢谢!我希望我早点问你,今天早上差点把自己逼疯了。感谢你确保我度过愉快的下午! - Hilary Park
哇,这真的非常简单!我正在努力理解哈希算法,这是其中许多算法中非常常见的操作。 - Mike Perrenoud
5
这也等同于在模2意义下的加法。- 这是什么意思? - rd10
1
@RajaDorji在这里解释了:(https://cs.stackexchange.com/questions/41664/confused-about-xoring-and-addition-modulo-2) - mlynn
太好了。这解释了这个谜题。 - picachu

56

^Python 按位异或运算符。在 Python 中,它就是表示 XOR 的方法:

>>> 0 ^ 0
0
>>> 0 ^ 1
1
>>> 1 ^ 0
1
>>> 1 ^ 1
0

XOR代表异或。在密码学中使用它是因为它允许您使用掩码“翻转”位以进行可逆操作:

>>> 10 ^ 5
15
>>> 15 ^ 5
10

其中5是掩码;(输入 XOR 掩码) XOR 掩码可以让你再次得到输入。


5
真值表说出了真相 - 在交谈中,我通常将XOR(异或,有时也称为EOR)描述为“要么是A,要么是B,但不会同时是A和B,也不会是A和B都不是”。 - Eight-Bit Guru
2
谢谢!!!你和另一个回答者肯定为我节省了一天的理智 - 我根本想不出来,而且它也无法在谷歌上搜索到。 - Hilary Park

17

有关异或操作的一些额外信息。

  • 将数字与自身进行奇数次异或,结果是数字本身。
  • 将数字与自身进行偶数次异或,结果为0。
  • 另外,与0进行异或操作始终得到数字本身。

5

其他答案没有提到的一件事是负数与异或 -

 a  |  b  | a ^ b
----|-----|------
 0  |  0  |  0
 0  |  1  |  1
 1  |  0  |  1
 1  |  1  |  0

虽然你可以轻松理解XOR如何使用上述函数表,但它并不说明它在负数上的工作原理。

XOR如何处理负数:

由于此问题也标记为Python,我将考虑这一点来回答。 XOR (^)是一个逻辑运算符,当比特位不同时返回1,在其他情况下返回0。

负数以二进制补码 形式存储。在2的补码中,最左边的位位置保留用于表示值的符号(正或负),并且不对数字的值做出贡献。

Python中,负数使用前导1而不是前导零进行编写。因此,如果您仅使用8位来表示二进制补码数字,则将模式从0000000001111111视为从0到127的整数,并保留1xxxxxxx 用于编写负数。

考虑到这一点,让我们通过一个例子了解XOR如何处理负数。我们考虑表达式 - ( -5 ^ -3 )

  • -5的二进制表示可以看作是1000...101
  • -3的二进制表示可以看作是1000...011

这里,...代表所有的0,其数量取决于用于表示的位数(32位、64位等)。在二进制表示中,MSB(最高有效位)上的1表示该数字为负数。与往常一样,XOR操作将在所有位上进行。

XOR操作:

      -5   :  10000101          |
     ^                          | 
      -3   :  10000011          |  
    ===================         |
    Result :  00000110  =  6    |
________________________________|


     ∴ -5 ^ -3 = 6

由于在异或操作后MSB变为0,因此我们得到的结果是一个正数。同样地,对于所有负数,我们使用二进制补码(最常用的之一)表示它们的表示形式,并在其二进制表示上进行简单的异或运算。

结果的MSB位表示符号,其余位表示最终结果的值。

以下表格可用于确定结果的符号。

  a   |   b   | a ^ b
------|-------|------
  +   |   +   |   +
  +   |   -   |   -
  -   |   +   |   -
  -   |   -   |   +

XOR的基本规则在负数XOR操作中仍然保持不变,但是负数中该操作的实际运作方式可能对某些人在某个时候有用。

4

XOR的另一个应用是电路中,它用于对位进行求和。

当您查看真值表时:

 x | y | x^y
---|---|-----
 0 | 0 |  0     // 0 plus 0 = 0 
 0 | 1 |  1     // 0 plus 1 = 1
 1 | 0 |  1     // 1 plus 0 = 1
 1 | 1 |  0     // 1 plus 1 = 0 ; binary math with 1 bit

你可以注意到,XOR的结果是x和y相加,不考虑进位,进位是由x和y之间的AND得到的。
x^y // is actually ~xy + ~yx
    // Which is the (negated x ANDed with y) OR ( negated y ANDed with x ).

2

(^)异或运算符在两个不同的位(0和1)上应用时生成1。当它在两个相同的位(0和0或1和1)上应用时,它生成0。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接