157

個人的には排他的な or , ^, 演算子が、その簡潔さゆえにブール チェックのコンテキストで理にかなっている場合に気に入っています。私は書くことをはるかに好む

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

よりも

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

しかし、他の経験豊富な Java 開発者 (初心者だけでなく) からよく当惑したり、ビット単位の操作にのみ使用する方法についてコメントされることもあります。

^オペレーターの使用に関するベストプラクティスについて知りたいです。

4

12 に答える 12

310

代わりに簡単に使用できます!=

于 2008-10-02T02:59:29.920 に答える
27

あなた自身の質問に答えたと思います-人々から変な目で見られた場合は、より明確なオプションを使用する方がおそらく安全です.

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

于 2008-10-02T03:34:54.033 に答える
18

よく似た会話をしていると思います。一方では、目標を達成するためのコンパクトで効率的な方法があります。一方で、チームの他のメンバーが理解できない可能性のあるものがあると、将来の維持が難しくなります。

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

うまくいかない例として、一時変数を使用せずに xor を使用して 2 つの変数を交換するトリックを取り上げます。これは、誰もが慣れ親しんでいるとは思わないトリックなので、コード レビューに合格しません。

于 2008-10-02T05:00:48.287 に答える
14

など、コメントいただければ大丈夫だと思います// ^ == XOR

于 2008-10-02T02:59:38.953 に答える
11

いつでも関数でラップして、詳細な名前を付けることができます。

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の質問は次のとおりです。

于 2013-02-22T18:28:52.193 に答える
5
if((boolean1 && !boolean2) || (boolean2 && !boolean1)) 
{ 
  //do it 
} 

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

if(boolean1 != boolean2) 
{ 
  //do it 
} 
于 2010-04-10T08:33:35.980 に答える
5

コードの明確さを念頭に置いて、ブール値チェックで XOR を使用することは、XOR ビット単位演算子の一般的な使用法ではないと私は考えています。私の経験から、Java のビット単位の XOR は通常、マスクflag toggle動作を実装するために使用されます。

flags = flags ^ MASK;

Vipan Singla によるこの記事では、使用例について詳しく説明しています。

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

于 2012-10-21T05:11:36.453 に答える
-3

ビット単位の演算子として、xor はそれを置き換える他のどの手段よりもはるかに高速です。そのため、パフォーマンスが重要でスケーラブルな計算には、xor が不可欠です。

私の主観的な意見: ブール値に等価 (== または !=) を使用することは、いかなる目的においても絶対に禁止されています。それを使用することは、基本的なプログラミングの倫理と基礎の欠如を示しています。あなたを混乱させている人は、ブール代数の基礎に戻されるべきです (私はここで「信念の川へ」と書きたくなりました:))。

于 2011-03-24T16:44:09.557 に答える
-3

!= は 2 つの変数の比較に使用できます。ただし、複数の比較では機能しません。

于 2009-02-05T10:13:25.503 に答える
-3

使用パターンがそれを正当化するのであれば、それはなぜですか? あなたのチームはオペレーターをすぐには認識できませんが、時間の経過とともに認識できるようになります。人間は常に新しい言葉を学びます。なぜプログラミングではないのですか?

私が述べるかもしれない唯一の注意は、「^」には2番目のブールチェックの短絡セマンティクスがないことです。短絡セマンティクスが本当に必要な場合は、静的 util メソッドも機能します。

public static boolean xor(boolean a, boolean b) {
    return (a && !b) || (b && !a);
}
于 2008-10-02T03:03:02.110 に答える
-4
str.contains("!=") ^ str.startsWith("not(")

よりも私にとっては良く見えます

str.contains("!=") != str.startsWith("not(")
于 2010-11-17T14:54:47.453 に答える