誰かが書いたコードを|=
調べて、使用法を見て、Java 演算子を調べたところ、ビットごとの or と代入操作が示唆されました。
それを読み取ったコードは次のとおりです。
for (String search : textSearch.getValue())
matches |= field.contains(search);
誰かが書いたコードを|=
調べて、使用法を見て、Java 演算子を調べたところ、ビットごとの or と代入操作が示唆されました。
それを読み取ったコードは次のとおりです。
for (String search : textSearch.getValue())
matches |= field.contains(search);
a |= b;
と同じです
a = (a | b);
2 つのオペランドのビットごとのORを計算し、結果を左側のオペランドに割り当てます。
サンプルコードを説明するには:
for (String search : textSearch.getValue())
matches |= field.contains(search);
だと思いmatches
ますboolean
。これは、ビットごとの演算子が論理演算子と同じように動作することを意味します。
ループの各反復で、から返されるものは何でもOR
の現在の値です。これには、すでに true であった場合、またはtrue を返す場合に設定する効果があります。matches
field.contains()
true
field.contains()
したがって、ループ全体でへの呼び出しのいずれかが を返したかどうかを計算します。field.contains()
true
a |= b
と同じですa = (a | b)
ブール変数
boolean
コンテキストでは、次のことを意味します。
if (b) {
a = true;
}
つまり、 true の場合b
は true にa
なり、そうでない場合a
は変更されません。
ビット演算
ビット単位のコンテキストでは、 に設定されているすべてのバイナリ ビットがb
に設定されることを意味しa
ます。でクリアされたビットはb
で変更されませんa
。
したがって、ビット 0 が に設定されている場合、以下の例に従って、b
にも設定されます。a
これにより、整数の最下位ビットが設定されます。
a |= 0x01
これにより、最下位ビットがクリアされます。
a &= ~0x01
これにより、最下位ビットがトグルされます。
a ^= 0x01;
このコード:
int i = 5;
i |= 10;
は、次のコードと同等です。
int i = 5;
i = i | 10;
同様に、このコード:
boolean b = false;
b |= true;
これと同等です:
boolean b = false;
b = b | true;
最初の例では、ビットごとの OR が実行されています。2 番目の例では、ブール OR が実行されます。
a |= b
と同じですa = a | b
a | b
両方のオペランドが整数型 (int、short など) の場合、ビット単位の演算子です。 両方のオペランドがブール値の場合、それはブール値の or です。
a
とが両方ともブール値の場合、とb
の違いは、最初の場合は常に両方が評価され、後者では が false の場合にのみ評価されることです。これは一種の「ショートカット」演算子です。a | b
a || b
b
a
これは、次のような状況で役立ちます。
if (a == null || a.equals(b)) { .. do something .. } // works
if (a == null | a.equals(b)) { .. do something .. } // NPE if a is null
一方、||
実際には、バイトコード/マシンコードの別の条件付きジャンプとして実装されています。場合によっては、|
演算子を使用してブール条件を評価し、追加のジャンプ (したがって分岐予測など) を回避する方が高速な場合があります。間違いなく、どちらが優れているかを判断するための低レベルのマイクロベンチマークのためのものです (通常、ほとんどのアプリケーションでは重要ではありません)。
あなたがそうするとき、a |= b
あなたは常に と の両方a
を評価していますb
。同等のものは次のように変換されるa ||= b
ため、演算子を使用しても意味がありません。a = a || b
if (a) a = true;
else if (b) a = true
else a = false;
||
...評価の条件付きの性質のため。つまり、すでに true のb
場合は評価されません。a
コードにバグがあり、それが意図されていた可能性はありますか
matches = matches || field.contains(search);
true
少なくとも1つのフィールドにsearch
変数が含まれている場合、一致する必要がありますか?
そのコード スニペットは、その演算子をいつ使用するかの悪い例です。正直なところ、この演算子をいつ使用するかの良い例は思いつきませんが、これが私の最善の試みです:
boolean somethingIsTrue = testSomethingTrue();
if(somethingIsTrue){
//Do something
}
somethingIsTrue |= testSomethingElseTrue();
if(somethingIsTrue){
//Do something else
}
somethingIsTrue |= testSomethingElseTrue2();
if(somethingIsTrue){
//Do something else than something or something else
}
注: 3 つの if が必要somethingIsTrue | testSomethingElseTrue()
です。
最初の例でなぜ演算子を使用すべきではないのか疑問に思われた場合は、次の理由をご覧ください。
パフォーマンスの観点からは、単なる比較ではなくループごとに比較と割り当てを行うため、パフォーマンスが低下します。また、将来の反復が効果を持たない場合でも反復を続けます (一度matches
設定するtrue
と変更されず、String.contains
副作用もありません)。
この質問の存在のみに基づいて、読みやすさの観点からも貧弱です;)
したがって、そのスニペットの代わりに、次のようにします。
for (String search : textSearch.getValue()){
if(field.contains(search)){
matches = true;
break;
}
}
余談ですが、元のコーダーがこれを書いたとき、コードゴルフをやりすぎたように思えます:)