XOR
なぜC#に条件演算子がないのですか?
例:
true xor false = true
true xor true = false
false xor false = false
XOR
なぜC#に条件演算子がないのですか?
例:
true xor false = true
true xor true = false
false xor false = false
& | ^
)と条件演算子(&& ||
)を参照していると思います。しかし、その通りです(もちろん)、論理XORがあります
回答:
C#では、条件演算子は必要な場合にのみ2次オペランドを実行します。
XORは定義上両方の値をテストする必要があるため、条件付きバージョンはばかげています。
例:
論理積:&
-毎回両側をテストします。
論理OR:|
-毎回両側をテストします。
条件付きAND:-1&&
番目の側が真の場合にのみ2番目の側をテストします。
条件付きOR:-1||
番目の側がfalseの場合にのみ、2番目の側をテストします。
質問は少し時代遅れですが...
この演算子は次のように機能します。
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
^
には、ブールオペランドとともに使用すると、ブール演算子であることが明示的に記載されています。"boolオペランドの場合、^演算子は不等式演算子!="と同じ結果を計算します。整数のオペランドをビット単位でxorすることもできます^
。C#はCではない
明確化と同様に、^演算子は整数型とブール値の両方で機能します。
MSDNの^演算子(C#リファレンス)を参照してください:
二項^演算子は、整数型とブール値に対して事前定義されています。整数型の場合、^はそのオペランドのビット単位の排他的論理和を計算します。ブールオペランドの場合、^はそのオペランドの論理排他的論理和を計算します。つまり、そのオペランドの1つだけが真である場合にのみ、結果は真になります。
たぶん、この質問がされた2011年以降、ドキュメントが変更されています。
^
、5年前にある他の回答へのコメントまたは編集としてより適切であるように思われます。何かが変わったとは思えません。
そうそう、そうです。
bool b1 = true;
bool b2 = false;
bool XOR = b1 ^ b2;
i1
バイトと同じように、です)。これは100%定義され、安全に管理された動作です。CLRは大まかなものではありません。この動作を最初に見たのは、MicrosoftPexを使用したときでした。
条件付きxorは存在しませんが、xorはブール値に対して定義されており、すべての条件付き比較はブール値に評価されるため、論理論理和を使用できます。
したがって、次のように言うことができます。
if ( (a == b) ^ (c == d))
{
}
1
。これはほとんど知られていない事実です。2つの偽でないブール値のxorがまだ偽でない状況になる可能性があります。つまり、この特定のコードでは、xor演算子は[0,1]の値にのみ適用されるため、私のコメントは(完全には)適用されません。
&
また、脆弱です。
&&
ようにコンパイルし&
たからです。
あるが論理XOR演算子は^
、全く存在しない条件付きのXOR演算子。以下を使用して、2つの値AとBの条件付きxorを実現できます。
A ? (!B) : B
両親は必要ありませんが、わかりやすくするために追加しました。
The Evil Greeboが指摘しているように、これは両方の式を評価しますが、xorをandやorのように短絡させることはできません。
0101 ^ 0011
値は0110
。です。
条件付き(短絡)XORのようなものはありません。条件演算子は、最初の引数だけを見て最終的な結果を明確に伝える方法がある場合にのみ意味があります。XOR(および加算)には常に2つの引数が必要であるため、最初の引数の後で短絡する方法はありません。
A = trueがわかっている場合、(A XOR B)=!Bです。
A = falseがわかっている場合、(A XOR B)= Bです。
どちらの場合も、Aは知っているがBは知らない場合は、十分に知ることができません(A XORB)。答えを計算するには、常にAと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ではありません。
この質問は感情的に答えられましたが、私は別の状況に遭遇しました。条件付き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...
}
}
この例では、左が10(0xa)に設定され、右が5(0x5)に設定されている場合、「成功」ブランチが入力されます。この(ばかげている場合は単純な)例では、左と右を同時に回してはならないため、バグが発生します。質問者から私が集めたのは、彼が実際に条件付きを望んでいたということではなく、xorに渡された値に対してtrue / falseを実行する簡単な方法です。
マクロはトリックを行うことができます:
#define my_xor(a, b) ( ((a)?1:0) ^ ((b)?1:0) )
私がマークから外れている場合は、遠慮なく私を叩いてください:o)
私がこれを投稿した後、私は以下のjimreedの答えを読みました(悪いYapdog!)、そして彼は実際にはもっと単純です。それはうまくいくでしょう、そして私は彼の答えがなぜ投票されなかったのか全く分かりません...
if
ブール式が必要です。intでコンパイルすることもできません。
!=
代替としてどのように機能しますか?