| 本條目存在以下問題,請協助 改善本條目或在 討論頁針對議題發表看法。
| 此條目需要 精通或熟悉相关主题的编者参与及协助编辑。 (2013年10月25日) 請邀請適合的人士改善本条目。更多的細節與詳情請參见討論頁。 |
|
「
异或」和「
互斥或」均重定向至此。关于邏輯門,请见「
异或门」。
的文氏图
在数字逻辑中,逻辑算符互斥或(英語:Exclusive or)是对两个运算元的一种邏輯分析类型。与一般的邏輯或不同,當兩兩數值相同時為否,而數值不同時為真。[1]
对于命题
,
异或
通常记作
或
。在编程语言中,常写作p ^ q
。
逻辑异或相当于逻辑不等价,或者说逻辑异或的逻辑非是逻辑等价。
异或运算
的真值表如下:
![{\displaystyle p}](https://wikimedia.org/api/rest_v1/media/math/render/svg/81eac1e205430d1f40810df36a0edffdc367af36) |
![{\displaystyle q}](https://wikimedia.org/api/rest_v1/media/math/render/svg/06809d64fa7c817ffc7e323f85997f783dbdf71d) |
|
True |
True |
False
|
True |
False |
True
|
False |
True |
True
|
False |
False |
False
|
注:True:真,False:假。
|
无论怎样改变同一行中
的位置,真值表都是成立的。
在数学和工程学中,常常用其他的逻辑运算符来表示异或算符。异或算符可以使用逻辑算符逻辑与
,逻辑或
和逻辑非
表示为:
![{\displaystyle {\begin{aligned}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{aligned}}}](https://wikimedia.org/api/rest_v1/media/math/render/svg/ad61aa71351cefff5092198ef8330db6bbb20152)
另外,异或算符可以被推广,得到关于n个运算元的异或运算:n个运算元的n维异或的值为真当且仅当其中值为真的运算元有奇数个。
异或也可以被表示为:
![{\displaystyle p\oplus q=\lnot ((p\land q)\lor (\lnot p\land \lnot q))}](https://wikimedia.org/api/rest_v1/media/math/render/svg/3ed8282174ebcbcfdc684c2a81430a28e3330674)
异或还可以看作是逻辑等价关系的非运算。
交换律:
结合律:
恒等律:
归零律:
对合运算:
尽管算子
(逻辑合取)与
(逻辑析取)是逻辑系统中最为常见的算子,但结构上,系统
and
只是幺半群。因此,这两个系统无法合成为一个更大的结构,比如环或半环。
但是,带有逻辑异或的系统
是一个交换群。因此,算子
与
的结合在集合
上作用就产生了最基本的二元域
。这个域可以得出所有运用
可以得到的结果,并且由于附带了域的结构,可以进行代数上的进一步分析。
名稱 |
符號 |
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運算可用來交換變數,但比起使用額外變數來交換變數的做法相比,效能反而比較差。
|
---|
|
- 恆真(
)
| | |
- 与非(
)
- 反蕴涵(
)
- 蕴涵(
)
- 或(
)
| |
- 非(
)
- 异或(
)
- 双条件(
)
- 命题
| |
- 或非(
)
- 非蕴涵(
)
- 反非蕴涵(
)
- 与(
)
| |
- 恆假(
)
|
|