有条件的XOR?

时间:2011-06-28 14:12:38

标签: c# operators xor boolean-operations

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

示例:

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

11 个答案:

答案 0 :(得分:226)

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

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

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

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

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

因此,您可以看到未使用的^^可以替换为现有的!=

答案 1 :(得分:104)

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

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

<强>实施例

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

  • 逻辑OR:| - 每次都测试双方。

  • 条件AND:&& - 只测试第一面是否为第二面。

  • 条件OR:|| - 如果第一面错误,则仅测试第二面。

答案 2 :(得分:22)

有逻辑XOR运算符:^

文档:C# Operators^ Operator

答案 3 :(得分:19)

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

请参阅MSDN's ^ Operator (C# Reference)

  

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

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

答案 4 :(得分:11)

正如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

参考:  Exclusive OR

答案 5 :(得分:4)

哦,是的,确实如此。

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

答案 6 :(得分:4)

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

所以你可以这样说:

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

}

答案 7 :(得分:4)

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

A ? (!B) : B

parens不是必需的,但为了清楚起见,我添加了它们。

正如The Evil Greebo所指出的,这会对两种表达形式进行评估,但xor不能像以及那样短路。

答案 8 :(得分:1)

你可以使用:

a = b ^ c;

就像在c / c ++中一样

答案 9 :(得分:0)

没有诸如条件(短路)XOR之类的东西。条件运算符仅在有办法通过仅查看第一个参数来明确告诉最终结果时才有意义。 XOR(和加法)总是需要两个参数,因此在第一个参数之后无法短路。

如果您知道A = true,则(A XOR B)=!B。

如果您知道A = false,则(A XOR B)= B。

在两种情况下,如果您了解A但不了解B,那么您所了解的不足(A XOR B)。您必须始终学习A和B的值才能计算出答案。几乎没有用例可以解决没有两个值的XOR。

请记住,按定义XOR有四种情况:

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

再次,希望从上面显而易见的是,在不知道第二个值的情况下,仅知道第一个值永远不足以得到答案。但是,在您的问题中,您省略了第一种情况。如果您相反想要

false op true  = false (or DontCare)
true  op false = true
true  op true  = false
false op false = false

那么您确实可以通过短路条件操作来获得它:

A && !B

但这不是XOR。

答案 10 :(得分:-3)

这个问题得到了有效回答,但我遇到了不同的情况。确实,不需要有条件的异或。也可以使用^运算符。但是,如果您只需要测试操作数的“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。

宏可以解决这个问题:

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

如果我不在标准的话,请随意拍我:o)

我在发布这个(糟糕的Yapdog!)之后读了下面的jimreed的答案,而他实际上更简单。它会工作,我完全不知道为什么他的答案被否决了......