逻辑异或

当且仅当两个输入值中一个为真时输出为真

在数字逻辑中,逻辑算符异或(英语:Exclusive or)是对两个运算元的一种逻辑分析类型。与一般的逻辑或不同,当两两数值相同时为否,而数值不同时为真。[1]

文氏图

对于命题 异或通常记作。在编程语言中,常写作p ^ q

逻辑异或相当于逻辑不等价,或者说逻辑异或的逻辑非逻辑等价

真值表

编辑

异或运算 真值表如下:

     
True True False
True False True
False True True
False False False
注:True:真,False:假。

无论怎样改变同一行中 的位置,真值表都是成立的。

其他表示

编辑

在数学和工程学中,常常用其他的逻辑运算符来表示异或算符。异或算符可以使用逻辑算符逻辑与 逻辑或 逻辑非 表示为:

 

另外,异或算符可以被推广,得到关于n个运算元的异或运算:n个运算元的n维异或的值为真当且仅当其中值为真的运算元有奇数个。

异或也可以被表示为:

 

异或还可以看作是逻辑等价关系的非运算。

性质

编辑

交换律 

结合律 

恒等律 

归零律 

对合运算 

与抽象代数的关系

编辑

尽管算子 逻辑合取)与 逻辑析取)是逻辑系统中最为常见的算子,但结构上,系统  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运算可用来交换变量,但比起使用额外变量来交换变量的做法相比,性能反而比较差。

参考来源

编辑
  1. ^ Germundsson, Roger; Weisstein, Eric. XOR. MathWorld. Wolfram Research. [17 June 2015]. (原始内容存档于2015-09-05). 

参见

编辑