有条件的XOR?

C#怎么没有一个条件XOR操作符?

例:

 true xor false = true true xor true = false false xor false = false 

在C#中,条件运算符只在必要时执行其次操作数。

由于XOR 必须按照定义testing两个值,所以有条件的版本将是愚蠢的。

例如

  • 逻辑AND: & – 每次testing双方。

  • 逻辑或: | – 每次testing双方。

  • 有条件AND: && – 只在第一面为真时testing第二面。

  • 有条件的OR: || – 如果第一面是假的,只testing第二面。

问题有点过时,但…

这是这个运营商应该如何工作:

 true xor false = true true xor true = false false xor false = false 

这是如何!=运算符与布尔types的工作:

 (true != false) // true (true != true) // false (false != false) // false 

所以,如你所见,未知的^^可以用现有的!=replace

有逻辑XOR运算符: ^

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

就像澄清一样,^运算符与整数types和bool一起工作。

请参阅MSDN> ^运算符(C#参考): https : //msdn.microsoft.com/en-gb/library/zkacc7k1(v= vs.140) .aspx

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

也许从2011年起,当这个问题被问到文档已经改变。

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

  Func<bool, bool, bool> XOR = (X,Y) => ((!X) && Y) || (X && (!Y)); 

这里是真值表:

  X | Y | Result ============== 0 | 0 | 0 1 | 0 | 1 0 | 1 | 1 1 | 1 | 0 

参考:“ 异或”

虽然有一个逻辑异或运算符^ ,没有条件异或运算符。 您可以使用以下方法实现两个值A和B的条件异或:

 A ? (!B) : B 

这些parens是没有必要的,但为了清晰起见,我添加了它们。

正如The Evil Greebo所指出的那样,这两个expression式都是评估的,但是xor不能像andor那样被短路。

有条件的xor不存在,但是可以使用逻辑1,因为xor是为布尔值定义的,所有条件比较的结果都是布尔值。

所以你可以这样说:

 if ( (a == b) ^ (c == d)) { } 

哦,是的,它的确如此。

 bool b1 = true; bool b2 = false; bool XOR = b1 ^ b2; 

您可以使用:

 a = b ^ c; 

就像在c / c ++中一样

这个问题已经得到了有效的回答,但是我遇到了一个不同的情况。 确实没有必要进行条件XOR。 也可以使用^运算符。 但是,如果只需要testing操作数的“true‖false”状态,那么会导致麻烦。 例如:

 void Turn(int left, int right) { if (left ^ right) { //success... turn the car left or right... } else { //error... no turn or both left AND right are set... } } 

在这个例子中,如果left设置为10(0xa)并且right设置为5(0x5),那么进入“success”分支。 对于这个(简单如果愚蠢)的例子,这将导致一个错误,因为你不应该同时左转和右转。 我从提问者处收集的信息并不是他实际上需要一个条件的,而是一个简单的方法来对传递给xor的值执行true / false。

一个macros可以做的伎俩:

 #define my_xor(a, b) ( ((a)?1:0) ^ ((b)?1:0) ) 

如果我不符合标准,请随时给我打电话:o)

我发布了这个(坏的Yapdog!)之后,我读到了jimreed的答案,而且他实际上更简单。 这将工作,我绝对不知道为什么他的答案被拒绝…