C#为什么没有条件XOR
运算符?
例:
true xor false = true
true xor true = false
false xor false = false
C#为什么没有条件XOR
运算符?
例:
true xor false = true
true xor true = false
false xor false = false
& | ^
)与条件运算符(&& ||
)。但是您是对的(当然),这是合乎逻辑的XOR ...
Answers:
在C#中,条件运算符仅在必要时执行其辅助操作数。
由于按定义XOR必须同时测试两个值,因此条件版本会很愚蠢。
例子:
逻辑与:&
-每次都测试双方。
逻辑或:|
-每次都测试双方。
条件AND:&&
-仅当第一面为真时才测试第二面。
有条件的OR:||
-如果第一面为假,则仅测试第二面。
问题有点过时了,但是...
此运算符应如何工作:
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
如您所见,不存在的东西^^
可以替换为现有的!=
!=
会为此工作。
AND
和OR
,但毫无作为XOR
。或至少我们没有意识到!=
:) @TheEvilGreebo
^
,当与布尔操作数一起使用时,它是布尔运算符。“对于布尔操作数,^运算符计算的结果与不等式运算符!=“相同。您也可以使用进行按位异或整数操作数^
。C#是不是C.
澄清一下,^运算符可用于整数类型和布尔型。
请参见MSDN的^运算符(C#参考):
预定义了整数类型和布尔值的二进制^运算符。对于整数类型,^计算其操作数的按位异或。对于布尔操作数,^计算其操作数的逻辑异或;也就是说,只有且仅当其操作数之一为真时,结果才为真。
自2011年提出此问题以来,文档可能已更改。
^
并早于五年的答案的评论或编辑。我怀疑一切都没有改变。
哦,是的。
bool b1 = true;
bool b2 = false;
bool XOR = b1 ^ b2;
i1
,就像一个字节一样)。这是100%定义的安全行为。CLR尚未完善。我第一次看到这种行为是在使用Microsoft Pex时。
条件xor不存在,但是您可以使用逻辑1,因为xor是为布尔值定义的,并且所有条件比较的结果均为布尔值。
因此,您可以说类似以下内容:
if ( (a == b) ^ (c == d))
{
}
1
。这是一个鲜为人知的事实。您可能会遇到两个非虚假布尔值的xor仍然非虚假的情况!也就是说,在此特定代码中,xor运算符仅应用于[0,1]中的值,因此我的注释不(完全)适用。
&
也很脆弱。
&&
因此将&
其编译为错误编译。
虽然存在逻辑异或运算符^
,但没有条件异或运算符。您可以使用以下方法获得两个值A和B的条件异或:
A ? (!B) : B
括号不是必需的,但为清楚起见,我添加了它们。
正如The Evil Greebo指出的那样,这将对两个表达式求值,但是xor不能像and和or那样短路。
0101 ^ 0011
具有值0110
。
没有条件(短路)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。也可以使用^运算符。但是,如果只需要测试操作数的“真||假”状态,则^会导致麻烦。例如:
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),则输入“成功”分支。对于此示例(如果愚蠢的话是简单的),这将导致错误,因为您不应同时向左和向右转。我从发问者那里得到的并不是他实际上想要一个条件,而是一种简单的方法,对传递给异或值的值执行真/假。
宏可以解决问题:
#define my_xor(a, b) ( ((a)?1:0) ^ ((b)?1:0) )
如果我不喜欢,请随意打我:o)
发布此消息后,我在下面阅读了吉姆雷德(Jimreed)的回答(糟糕的Yapdog!),而他的回答实际上更简单。它将奏效,我完全不知道为什么他的答案被否决了。
if
需要一个布尔表达式,它甚至不会使用int进行编译。
!=
替代?