为什么C#不具备条件XOR
操作?
例:
true xor false = true
true xor true = false
false xor false = false
在C#中,有条件的经营者仅在必要时执行他们的二次操作。
自定义测试两个值的XOR必须的,有条件的版本将是愚蠢的。
例子:
&
- 测试双方的每一次。|
- 每次测试两侧。&&
- 只有当第一面是真实的测试第二侧。||
- 只测试第二个方面,如果第一方是假的。有没有这样的东西作为条件(短路)XOR。当有一个办法在于只看第一个参数明确告知最后的结局有条件运营商才有意义。 XOR(及附加)总是需要两个参数,所以没有办法的第一个参数后短路。
如果你知道一个= 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。
这个问题已经被情感上回答,但我碰到一个不同的形势下应运而生。这是真的,有没有必要条件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...
}
}
在这个例子中,如果不设置为10(是0xA)和右边设置为5(0x5的)输入了“成功”的分支。对于这个(简单,如果很傻)的示例,这将导致一个错误,因为你不应该左转,右在同一时间。我从提问者云集是不是他其实是想一个条件,但一个简单的方法来作为传递到XOR上的值进行真/假。
宏可以做的伎俩:
#define my_xor(a, b) ( ((a)?1:0) ^ ((b)?1:0) )
随意打我身边,如果我没谱:O)
我读jimreed的答案后,下面我发布这个(不好Yapdog!)他实际上是简单。它会工作,我完全不知道为什么他的回答被否决...
问题是有点过时,但...
这是该运营商应如何工作:
true xor false = true
true xor true = false
false xor false = false
这是多么=操作符与布尔类型!
(true != false) // true
(true != true) // false
(false != false) // false
所以当你看到unexisting ^^
可以与现有!=
被替换
有逻辑XOR运算符:^
正如澄清,^运算符可工作在整型和布尔。
见MSDN's ^ Operator (C# Reference):
二元^运算符预定义的整型和布尔。对于整型,^计算其数的按位异或。对于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
参考:Exclusive OR
哦,是的,它的作用。
bool b1 = true;
bool b2 = false;
bool XOR = b1 ^ b2;
有条件的XOR不存在,但可以使用,因为XOR是为布尔值定义的逻辑之一,所有的条件比较评估为布尔值。
所以,你可以这样说:
if ( (a == b) ^ (c == d))
{
}
虽然是一个逻辑XOR运算符^
,没有条件XOR运算。您可以通过以下实现两个值A的条件XOR和B:
A ? (!B) : B
该括号是没有必要的,但我加入他们的清晰度。
由于受邪Greebo指出,这种计算两个表达式,但XOR不能短路像AND和OR。
您可以使用:
a = b ^ c;
就像在C / C ++