web-dev-qa-db-ja.com

ブール値チェックにxor演算子を使用するのは良い習慣ですか?

個人的には、exclusive or^、演算子は、簡潔さのためにブール値チェックのコンテキストで意味がある場合に気に入っています。書くのが好きです

if (boolean1 ^ boolean2)
{
  //do it
}

より

if((boolean1 && !boolean2) || (boolean2 && !boolean1))
{
  //do it
}

しかし、初心者だけでなく、他の経験豊富なJava開発者から見た目が混乱することがよくあります。

^演算子の使用に関するベストプラクティスについて興味があります。

148
Peter

代わりに!=を使用できます。

296
Mike F

あなたはあなた自身の質問に答えたと思います-あなたが人々から奇妙な見た目を得るなら、おそらくより明確なオプションで行く方が安全です。

コメントする必要がある場合は、おそらくより冗長なバージョンに置き換えて、そもそも人々に質問させない方がよいでしょう。

27
Martin

似たような会話がたくさんあることがわかりました。一方では、目標を達成するためのコンパクトで効率的な方法があります。一方で、チームの他のメンバーが理解できないものがあり、将来の保守が難しくなります。

私の一般的なルールは、使用されているテクニックが一般的なプログラマーに知っておくのが妥当かどうかを尋ねることです。この場合、プログラマーにブール演算子の使用方法を知ってもらうのが妥当だと思うので、ifステートメントでxorを使用しても問題ありません。

大丈夫ではない何かの例として、一時変数を使用せずにxorを使用して2つの変数をスワップするトリックを取ります。これは、誰もが精通しているとは思わないだろうトリックなので、コードレビューに合格しません。

16
Dave Tarkowski

コメントしていただければ大丈夫だと思います。 // ^ == XOR

14
Dre

常に関数でラップして、冗長な名前を付けることができます。

public static boolean XOR(boolean A, boolean B) {
    return A ^ B;
}

しかし、^演算子が何のためにググっているかを知らなかった人にとって、それは本当に速く難しいことではないように思えます。初めてのことを覚えるのは難しくありません。他の用途を要求したので、ビットマスキングにXORを使用するのが一般的です。

XORを使用して、3番目の一時変数を使用せずに2つの変数の値を交換することもできます

// Swap the values in A and B
A ^= B;
B ^= A;
A ^= B;

XORスワッピングに関連するStackoverflowの質問 です。

9
Cory Gross

私は最近、職場のJavaScriptプロジェクトでxorを使用しました最終的に7行のコメントを追加しました何が起こっているのかを説明しました。そのコンテキストでxorを使用する理由は、用語の1つ(以下の例のterm1)は、2つではなく3つの値を取ることができるということでした:undefinedtrue、またはfalse、他の(term2)はtrueまたはfalseundefinedの場合に追加のチェックを追加する必要がありますが、xorでは、xorが最初の項を最初にブール値として評価し、undefinedfalseとして処理するため、以下で十分です。

if (term1 ^ term2) { ...

最終的には少しやり過ぎでしたが、とにかくイースターエッグのようにそこに残したかったのです。

6
Ates Goral
if((boolean1 && !boolean2) || (boolean2 && !boolean1)) 
{ 
  //do it 
} 

私見このコードは単純化できます:

if(boolean1 != boolean2) 
{ 
  //do it 
} 
5
Y--

コードの明快さを念頭に置いて、私の意見では、ブールチェックでXORを使用することは、XORビット単位演算子の一般的な使用法ではありません。私の経験から、XORのビット単位Javaは通常を使用してマスクflag toggleを実装します動作:

flags = flags ^ MASK;

This Vipan Singlaの記事では、使用例についてさらに詳しく説明しています。

例のようにビット単位のXORを使用する必要がある場合は、ビット単位の読み書きができる聴衆でさえトラックを止めて使用理由を理解する必要があるため、使用する理由をコメントしてください。

5
Gunnar Karlsson