Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 条件异或?_C#_Operators_Xor_Boolean Operations - Fatal编程技术网

C# 条件异或?

C# 条件异或?,c#,operators,xor,boolean-operations,C#,Operators,Xor,Boolean Operations,为什么C#没有条件的XOR操作符 例如: true xor false = true true xor true = false false xor false = false 存在逻辑异或运算符:^ 文档:而且哦,是的,它有 bool b1 = true; bool b2 = false; bool XOR = b1 ^ b2; 您可以使用: a = b ^ c; 与c/c++中的c#一样,条件运算符仅在必要时执行其辅助操作数 因为XOR必须根据定义测试这两个值,所以条件版本是愚蠢

为什么C#没有条件的XOR操作符

例如:

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

存在逻辑异或运算符:
^

文档:而且

哦,是的,它有

bool b1 = true;
bool b2 = false;
bool XOR = b1 ^ b2;
您可以使用:

a = b ^ c;
与c/c++

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

因为XOR必须根据定义测试这两个值,所以条件版本是愚蠢的

示例

  • 逻辑AND:
    -每次都测试两侧

  • 逻辑OR:
    |
    -每次都测试两侧

  • 条件AND:
    &&
    -仅在第一方为真时测试第二方

  • 条件或:
    |
    -仅当第二方为假时测试第二方


条件异或不存在,但您可以使用逻辑异或,因为xor是为布尔定义的,所有条件比较都计算为布尔

所以你可以这样说:

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

}

虽然存在逻辑异或运算符
^
,但不存在条件异或运算符。可以使用以下方法实现两个值a和B的条件异或:

A ? (!B) : B
Paren不是必需的,但为了清晰起见,我添加了它们


正如邪恶的格里博所指出的,这会计算两个表达式,但xor不能像那样短路。这个问题得到了有效的回答,但我遇到了不同的情况。的确,不需要条件异或。^运算符也可以使用。但是,如果只需要测试操作数的“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的值的真/假

宏可以做到这一点:

#define my_xor(a, b) ( ((a)?1:0) ^ ((b)?1:0) )
如果我偏离了目标,请随意拍打我:o)


在我发布了这篇文章(糟糕的Yapdog!)之后,我阅读了jimreed下面的答案,他的答案实际上更简单。这是可行的,我完全不知道为什么他的答案被否决了…

这个问题有点过时,但

这就是这个操作员应该如何工作:

true xor false = true
true xor true = false
false xor true = true
false xor false = false
这就是为什么!=运算符使用布尔类型:

(true != false) // true
(true != true) // false
(false != true) // true
(false != false) // false
如您所见,不存在的
^
可以替换为现有的
=

根据的要求,以下是正确的版本:

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

作为澄清,^运算符同时处理整型和bool

见:

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


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

没有条件(短路)异或。条件运算符只有在能够通过只查看第一个参数来确定最终结果时才有意义。XOR(和加法)总是需要两个参数,所以在第一个参数之后无法短路

如果你知道A=true,那么(A或B)=!B

如果你知道A=false,那么(A或B)=B

在这两种情况下,如果您知道A但不知道B,那么您知道的还不够多,无法知道(A或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

但这不是异或。

怎么会
=用作替代?C#有一个异或运算符(x^y)。因此,我否认问题的前提。你能解释一下为什么你认为C#没有异或运算符吗?我很想知道为什么人们相信关于C的错误的东西。@Eric Lippert:我想他指的是逻辑运算符(
&| ^
)和条件运算符(
&&&&&|
)。但是你是对的(当然),有一个逻辑异或…@BoltClock:哦,如果问题是“为什么没有短路异或运算符?”——怎么会有?如果第一个参数为false,则不需要计算第二个参数。使用“或”,如果第一个参数为真,则不需要计算第二个参数。您始终需要评估xor的两个参数,这样就不会出现短路。这个问题本身更适合于Microsoft-因此这是一个拒绝投票的正当理由-但是如果是因为^operator而拒绝投票的人,那么您需要更仔细地阅读,因为这个问题是有条件的还是有逻辑的,而不是简单的“为什么没有异或”。逻辑的,不是有条件的。逻辑and=&,条件and=&&。他问的是有条件的,它是二进制的,不是逻辑的。它假设布尔值为0或1,这在CLR上不是真的。对不起,这个答案实际上没有回答关于条件运算符的问题。这是一个位运算符对于记录而言,此答案中链接的文档明确指出,
^
,当与布尔操作数一起使用时,是一个布尔运算符。对于布尔操作数,^运算符计算的结果与不等式运算符相同
A && !B