逻辑异或
在数字逻辑中,逻辑算符异或(英语:Exclusive or)是对两个运算元的一种逻辑分析类型。与一般的逻辑或不同,当两两数值相同时为否,而数值不同时为真。[1]
对于命题 <math>p, q</math>,<math>p</math>异或<math>q</math>通常记作<math>p \operatorname{XOR} q</math>或<math>p \oplus q</math>。在编程语言中,常写作p ^ q。
逻辑异或相当于逻辑不等价,或者说逻辑异或的逻辑非是逻辑等价。
真值表[编辑]
异或运算<math>p \oplus q</math>的真值表如下:
| <math>p</math> | <math>q</math> | <math>p \oplus q</math> |
|---|---|---|
| True | True | False |
| True | False | True |
| False | True | True |
| False | False | False |
| 注:True:真,False:假。 | ||
无论怎样改变同一行中<math>p, q, p \oplus q</math>的位置,真值表都是成立的。
其他表示[编辑]
在数学和工程学中,常常用其他的逻辑运算符来表示异或算符。异或算符可以使用逻辑算符逻辑与<math>\land</math>,逻辑或<math>\lor</math>和逻辑非<math>\lnot</math>表示为:
- <math>
\begin{align} p \oplus q & = (p \land \lnot q) \lor (\lnot p \land q) = p\overline{q} + \overline{p}q \\
& = (p \lor q) \land (\lnot p \lor \lnot q) = (p+q)(\overline{p}+\overline{q}) \\
& = (p \lor q) \land \lnot (p \land q) = (p+q)(\overline{pq})
\end{align} </math>
另外,异或算符可以被推广,得到关于n个运算元的异或运算:n个运算元的n维异或的值为真当且仅当其中值为真的运算元有奇数个。
异或也可以被表示为:
- <math>p \oplus q = \lnot ((p \land q) \lor (\lnot p \land \lnot q))</math>
异或还可以看作是逻辑等价关系的非运算。
性质[编辑]
交换律:<math>p \oplus q = q \oplus p</math>
结合律:<math>p \oplus (q \oplus r) = (p \oplus q) \oplus r</math>
恒等律:<math>p \oplus 0 = p</math>
归零律:<math>p \oplus p = 0</math>
对合运算:<math>p \oplus q \oplus q = p\oplus 0 = p</math>
与抽象代数的关系[编辑]
尽管算子<math>\wedge</math>(逻辑合取)与<math>\lor</math>(逻辑析取)是逻辑系统中最为常见的算子,但结构上,系统<math>(\{T, F\}, \wedge)</math> and <math>(\{T, F\}, \lor)</math>只是幺半群。因此,这两个系统无法合成为一个更大的结构,比如环或半环。
但是,带有逻辑异或的系统<math>(\{T, F\}, \oplus)</math>是一个交换群。因此,算子<math>\wedge</math>与<math>\oplus</math>的结合在集合<math>\{T, F\}</math>上作用就产生了最基本的二元域<math>F_2</math>。这个域可以得出所有运用<math>(\land, \lor)</math>可以得到的结果,并且由于附带了域的结构,可以进行代数上的进一步分析。
类似符号[编辑]
| 名称 | 符号 | Unicode | 图形 | 符号的来源 |
|---|---|---|---|---|
| 地球 | 🜨 | U+2295 | 地球的天文符号 | 带有赤道和一条经线的球体 |
应用[编辑]
使用异或运算交换两个 int 类型变量的数值[编辑]
C/C++
void swap(int *a, int *b) {
*a ^= *b;
*b ^= *a;
*a ^= *b;
}
Java
public void swap(int a, int b) {
a ^= b;
b ^= a;
a ^= b;
}
C#
public void swap(ref int a,ref int b)
{
a ^= b;
b ^= a;
a ^= b;
}
Rust
fn swap<'a, 'b>( num_a: &'a mut i32, num_b: &'b mut i32 ) {
*num_a ^= *num_b;
*num_b ^= *num_a;
*num_a ^= *num_b;
}
虽然XOR运算可用来交换变量,但比起使用额外变量来交换变量的做法相比,性能反而比较差。
参考来源[编辑]
- ^ Germundsson, Roger; Weisstein, Eric. XOR. MathWorld. Wolfram Research. [17 June 2015]. (原始内容存档于2015-09-05).