什么是C#中的异或符号`^`的作用?

10

谁能用一个好的例子来解释这个运算符?

我知道这个运算符是什么意思。我的意思是一个现实生活中的例子。


3
简单搜索: https://secure.wikimedia.org/wikipedia/en/wiki/Exclusive_or - thekip
我在我的答案中给了3。维基页面上大约有十几个。 - Merlyn Morgan-Graham
2
在我整个编程生涯中,我第一次发现了异或运算符的用途。如果将 ^ 用于 Math.Pow(),那将是一个更好的符号用法。 - Dan W
6个回答

18

它是逻辑运算中的一种实现,叫做“异或门”。

http://zh.wikipedia.org/wiki/异或

异或门通常用于位运算。例如:

  • 1 xor 1 = 0
  • 1 xor 0 = 1
  • 0 xor 1 = 1
  • 0 xor 0 = 0
  • 1110 xor 1001 = 0111 (这等同于无进位加法)

正如上面所述,因为异或与模2加法相同,所以两个n位字符串的位异或等同于向量空间(Z/2Z)^4中标准的加法向量。

在计算机科学中,异或有多种用途:

  • 它可以判断两个位是否不等。
  • 它是一个可选的位翻转器(决定性输入选择是否翻转数据输入)。
  • 它可以判断1位的奇数个数(当且仅当变量数目为奇数时为真)。

(还有很多其他用途)


14
例如,像这样:
var result = a ^ b;

result          a        b
--------------------------------
true            true    false
true            false   true
false           true    true
false           false   false

7

“异或”运算符只有在一个操作数为真时才会返回真。

foo ^ bar

等同于

(foo && !bar) || (!foo && bar)

@shenhengbin,你关于使用异或运算符评估布尔值的答案让我想到了:那么foo ^ barfoo != bar不是等价的吗? - T_D

2
当使用异或(XOR)时,只有在比较的语句中只有一个为真时,该语句才会评估为真。所以:
bool foo = true;
bool bar = false;
if (foo ^ bar) { bar = true;} // this evaluates to true 
bool baz = foo ^ bar; // This evaluates to false, since both statements are now true. 

1

编程语言的参考文档通常是查找运算符定义的最佳途径。

在这种情况下,MSDN是C#运算符最合适的定义。

根据文档

二进制^运算符是为整数类型和布尔类型预定义的。对于整数类型,^计算其操作数的按位异或。对于布尔操作数,^计算其操作数的逻辑异或;也就是说,仅当其操作数中恰好有一个为true时,结果才为true。

还列举了一个示例。


1

XOR是一种常见的布尔运算符,在C#中并没有什么特别之处。 我建议学习一下布尔代数,了解它在1位上的用途, 然后检查当你使用任意两个数字或字符a和b进行(a XOR b) XOR b操作时会得到什么。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接