有条件的XOR?

Gil*_*man 74 c# operators xor boolean-operations

为什么C#没有条件XOR运算符?

例:

true  xor false = true
true  xor true  = false
false xor false = false
Run Code Online (Sandbox Code Playgroud)

pio*_*rpo 248

问题有点过时但......

这个操作符应该如何工作:

true xor false = true
true xor true = false
false xor false = false
Run Code Online (Sandbox Code Playgroud)

这就是!=运算符与bool类型一起使用的方法:

(true != false) // true
(true != true) // false
(false != false) // false
Run Code Online (Sandbox Code Playgroud)

所以你看到^^现有的可以被替换掉!=

  • 这实际上是直接和正确解决问题的唯一答案. (40认同)
  • 我坐在这里面对自己,我没有意识到`!=`会为此工作. (34认同)
  • @TheEvilGreebo - 你说的是真的;!= 运算符在技术上不是条件 XOR 运算符。但是,这个答案实际上是说,“条件 XOR 运算符不存在,因为 != 运算符存在。” 反正我是这么读的。 (3认同)
  • 我认为几乎每个最终写这篇文章的人实际上都想对布尔值进行XOR。就像逻辑“ AND”和“ OR”一样,而没有逻辑“ XOR”。或至少我们没有意识到`!=`:) @TheEvilGreebo (3认同)
  • 答案是正确的,但评论不是。它没有解决这个问题,即“为什么 C# 没有条件 XOR?”。严格来说,这不是逻辑运算符,而是关系相等运算符。虽然结果与 XOR 相同,但它属于不同的类。它仅在测试两个布尔值时与 XOR 进行比较,并且仍然必须评估运算符的两侧。 (2认同)

The*_*ebo 109

在C#中,条件运算符仅在必要时才执行其辅助操作数.

由于XOR 必须按定义测试两个值,因此条件版本将是愚蠢的.

示例:

  • 逻辑AND:&- 每次测试双方.

  • 逻辑或:|- 每次测试双方.

  • 条件AND:&&- 如果第一侧为真,则仅测试第二侧.

  • 条件OR:||- 如果第一侧为假,则仅测试第二侧.

  • XOR运算符不会违反约定"条件运算符只在必要时才执行它们的辅助操作数".它总是必要的. (26认同)
  • 对于某些特定模式,条件XOR可能是一个漂亮而优雅的快捷方式,但不确定是否足够合理以将其包含在语言中.XOR可能证明有用的此类模式的示例是条件否定:当布尔表达式应该被否定时,给定第二个布尔表达式. (2认同)
  • 有条件的 XOR 有什么用呢?如果不比较双方以确定它们是否相等,则条件 XOR 永远无法进行评估。即使是比较两个 bool 的条件 XOR 的概念也必须检查每个 bool 的值并测试相等性。 (2认同)

ice*_*way 26

有逻辑XOR运算符: ^

文档:C#运算符^运算符

  • 合乎逻辑,没有条件。逻辑和 = &,条件和 = &&。他在问有条件的。 (3认同)
  • 它是二元的,不合逻辑的.它假设bool为0或1,这在CLR上是不正确的. (3认同)
  • 抱歉,此答案实际上并未回答有关 CONDITIONAL 运算符的问题。这有点操作符 (3认同)
  • 记录下来,此答案中链接的文档明确指出,当与布尔操作数一起使用时,^是布尔运算符。“对于布尔操作数,^运算符计算的结果与不等式运算符!=“相同。您也可以使用`^`进行按位异或整数操作数。C#不是C。 (2认同)

Ric*_*dCL 23

正如澄清一样,^运算符适用于整数类型和bool.

请参阅MSDN的^运算符(C#参考):

二元^运算符是为整数类型和bool预定义的.对于整数类型,^计算其操作数的按位异或.对于bool操作数,^计算其操作数的逻辑异或; 也就是说,当且仅当其中一个操作数为真时,结果才为真.

自2011年提出此问题以来,文档可能已发生变化.

  • 很久以来一直在用c#编程,从来不知道这个!谢谢@RichardCL! (2认同)

Sim*_*low 11

正如Mark L所说,这是正确的版本:

 Func<bool, bool, bool> XOR = (X,Y) => ((!X) && Y) || (X && (!Y));
Run Code Online (Sandbox Code Playgroud)

这是真值表:

 X | Y | Result
 ==============
 0 | 0 | 0
 1 | 0 | 1
 0 | 1 | 1
 1 | 1 | 0
Run Code Online (Sandbox Code Playgroud)

参考: 独家OR

  • 问的问题是为什么C#没有条件XOR运算符.这不回答这个问题.至于函数本身:这个函数确实作为条件XOR运行 - 但问题是,它是否比非条件XOR更有效?为了测试唯一真相,XOR必须确认一个且恰好一个结果为真.这意味着必须对双方进行评估和比较.上面的函数至少在反转一个值的同时测试和条件的两侧.我们内部是否知道这与XOR有什么不同? (2认同)

Arm*_*yan 5

哦,是的。

bool b1 = true;
bool b2 = false;
bool XOR = b1 ^ b2;
Run Code Online (Sandbox Code Playgroud)

  • @usr,在C#中,将^运算符应用于两个布尔操作数时是合乎逻辑的。您通过这些答案评论了很多,您是否曾经运行过任何代码来检验您的假设? (5认同)
  • 它是一个二元运算符,而不是逻辑运算符。它假设布尔值是 0 或 1,这在 CLR 上是不正确的。所以这段代码实际上可能无法工作。 (2认同)
  • @马克 我做到了:http://pastebin.com/U7vqpn6G打印true,尽管true ^ true应该是假的。bool并非始终等于0或1。它不是CLR上的逻辑类型。它是一个8位的量,带有任意内容。我本可以生成可验证的IL来演示该问题。 (2认同)
  • 例如,当使用C#以外的其他CLR语言时。我重复一遍:我本可以使用ILASM创建一个完全可验证的安全程序集来执行此操作(在IL级别,布尔值就像一个字节一样,只是一个“ i1”)。这是100%定义的安全行为。CLR尚未完善。我第一次看到此行为是在使用Microsoft Pex时。 (2认同)