84

XOR 执行什么数学运算?

4

6 回答 6

151

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 相同。

于 2013-01-25T16:58:00.743 回答
55

^ Python 按位异或运算符。这就是你XOR在 python 中的拼写方式:

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

XOR 代表异或。它用于密码学,因为它可以让您在可逆操作中使用掩码“翻转”位:

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

5面具在哪里;(输入异或掩码)异或掩码再次为您提供输入。

于 2013-01-25T16:56:52.343 回答
11

关于异或运算的更多信息。

  • XOR 一个数字与自身奇数次的结果是数字本身。
  • 与自身异或偶数次,结果为 0。
  • 此外,与 0 的 XOR 始终是数字本身。
于 2020-02-09T06:51:26.840 回答
5

其他答案在这里没有提到的一件事是带有负数的 XOR -

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

虽然您可以使用上面的函数表轻松理解 XOR 将如何工作,但它并没有说明它将如何处理负数。


XOR 如何处理负数:

由于这个问题也被标记为 python,所以我会考虑到这一点来回答它。XOR ( ^) 是一个逻辑运算符,当位不同时返回 1,其他位置返回 0 。

负数以二进制形式存储为二进制补码。在 2 的补码中,最左边的位位置是为值的符号(正或负)保留的,对数字的值没有贡献。

Python中,负数用前导一而不是前导零写入。因此,如果您仅将 8 位用于二进制补码 ,那么您将模式 from视为 00000000001111111127 的整数,并保留1xxxxxxx用于写入负数。

考虑到这一点,让我们通过一个示例来了解 XOR 如何对负数起作用。让我们考虑表达式 - ( -5 ^ -3 )

  • 的二进制表示-5可以被认为是1000...101
  • 的二进制表示-3可以被认为是1000...011

这里,...表示全 0,其数量取决于用于表示的位数(32 位、64 位等)。MSB (最高有效位)处的1at表示二进制表示的数字为负数。XOR 操作将照常对所有位进行。

异或运算:

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


     ∴ -5 ^ -3 = 6

由于异或运算后MSB变为0,所以我们得到的结果数是一个正数。同样,对于所有负数,我们考虑使用2 的补码(最常用的一种)以二进制格式表示它们,并对它们的二进制表示进行简单的 XOR。

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

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

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

XOR 的基本规则对于负 XOR 操作也保持不变,但是该操作如何在负数中真正起作用有一天可能对某人有用。

于 2020-06-16T21:31:19.770 回答
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 相加,没有跟踪进位位,进位位是从ANDx 和 y 之间获得的。

x^y // is actually ~xy + ~yx
    // Which is the (negated x ANDed with y) OR ( negated y ANDed with x ).
于 2020-06-17T18:57:45.140 回答
2

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

于 2020-07-15T14:24:54.213 回答