邏輯異或
在數位邏輯中,邏輯算符異或(英語: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).