web-dev-qa-db-ja.com

条件付きXOR?

C#に条件付きXOR演算子がないのはなぜですか?

例:

true  xor false = true
true  xor true  = false
false xor false = false
73
Gilad Naaman

C#では、条件演算子は、必要な場合にのみセカンダリオペランドを実行します

XOR mustは定義により両方の値をテストするため、条件付きバージョンはばかげているでしょう。

  • 論理AND:&-毎回両側をテストします。

  • 論理OR:|-毎回両側をテストします。

  • 条件付きAND:&&-1番目の側が真の場合にのみ2番目の側をテストします。

  • 条件付きOR:||-1番目の側がfalseの場合にのみ2番目の側をテストします。

106
The Evil Greebo

質問は少し時代遅れですが、...

この演算子の仕組みは次のとおりです。

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

これは!=演算子がbool型でどのように機能するかです:

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

したがって、存在しない^^は既存の!=に置き換えることができます

238
piotrpo

論理的なXOR演算子があります:^

ドキュメント: C#演算子 および ^演算子

25
iceaway

明確にするために、^演算子は整数型とブールの両方で機能します。

MSDNの^演算子(C#リファレンス) を参照してください:

バイナリ^演算子は、整数型およびブールに対して事前定義されています。整数型の場合、^はオペランドのビットごとの排他的論理和を計算します。 boolオペランドの場合、^はそのオペランドの排他的論理和を計算します。つまり、オペランドの1つが真である場合にのみ、結果が真になります。

この質問が行われた2011年以降、ドキュメントが変更された可能性があります。

23
RichardCL

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

参照: 排他的OR

11
Simple Fellow

ああ、そうだ。

bool b1 = true;
bool b2 = false;
bool XOR = b1 ^ b2;
4
Armen Tsirunyan

条件付きxorは存在しませんが、xorはブール値に対して定義されており、すべての条件付き比較はブール値に評価されるため、論理値を使用できます。

したがって、次のように言うことができます。

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

}
4
Klark

論理 xor演算子^条件付き xor演算子はありません。以下を使用して、2つの値AおよびBの条件付きxorを実現できます。

A ? (!B) : B

括弧は必要ありませんが、わかりやすくするために追加しました。

The Evil Greeboが指摘したように、これは両方の式を評価しますが、xorはandorのように短絡することはできません。

3
jimreed

使用できます:

a = b ^ c;

c/c ++のように

1
gulyan

条件付き(短絡)XORなどはありません。条件演算子は、最初の引数のみを調べて最終結果を明確に伝える方法がある場合にのみ意味があります。 XOR(および加算)は常に2つの引数を必要とするため、最初の引数の後に短絡する方法はありません。

A = trueがわかっている場合、(A XOR B)=!B。

A = falseがわかっている場合、(A XOR B)= B.

どちらの場合でも、Aを知っているがBを知らない場合は、知るだけの十分な知識がありません(A XOR B)。両方の値なしでXORを解決できるユースケースは文字通りありません。

XOR定義により、4つのケースがあります:

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

繰り返しますが、最初の値を知っていても、2番目の値を知らなくても答えを得るのに十分ではないことは、上記から明らかです。ただし、質問では、最初のケースを省略しました。代わりにしたい場合

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

それからあなたは実際に短絡条件付き操作によってそれを得ることができます:

A && !B

しかし、それはXORではありません。

0
Kevin Holt