22

誰かが書いたコードを|=調べて、使用法を見て、Java 演算子を調べたところ、ビットごとの or と代入操作が示唆されました。

それを読み取ったコードは次のとおりです。

    for (String search : textSearch.getValue())
         matches |= field.contains(search);
4

6 に答える 6

32
a |= b;

と同じです

a = (a | b);

2 つのオペランドのビットごとのORを計算し、結果を左側のオペランドに割り当てます。

サンプルコードを説明するには:

for (String search : textSearch.getValue())
    matches |= field.contains(search);

だと思いmatchesますboolean。これは、ビットごとの演算子が論理演算子と同じように動作することを意味します。

ループの各反復で、から返されるものは何でもORの現在の値です。これには、すでに true であった場合、またはtrue を返す場合に設定する効果があります。matchesfield.contains()truefield.contains()

したがって、ループ全体でへの呼び出しのいずれかが を返したかどうかを計算します。field.contains()true

于 2012-04-13T13:50:02.233 に答える
12

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;

于 2012-04-13T13:49:24.890 に答える
3

このコード:

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 が実行されます。

于 2012-04-13T13:50:45.467 に答える
2

a |= bと同じですa = a | b

a | b両方のオペランドが整数型 (int、short など) の場合、ビット単位の演算子です。 両方のオペランドがブール値の場合、それはブール値の or です。

aとが両方ともブール値の場合、とbの違いは、最初の場合は常に両方が評価され、後者では が false の場合にのみ評価されることです。これは一種の「ショートカット」演算子です。a | ba || bba

これは、次のような状況で役立ちます。

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

于 2012-04-13T14:20:03.240 に答える
1

コードにバグがあり、それが意図されていた可能性はありますか

matches = matches || field.contains(search);

true少なくとも1つのフィールドにsearch変数が含まれている場合、一致する必要がありますか?

于 2012-04-13T13:55:09.993 に答える
0

そのコード スニペットは、その演算子をいつ使用するかの悪い例です。正直なところ、この演算子をいつ使用するかの良い例は思いつきませんが、これが私の最善の試みです:

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;
    }
}

余談ですが、元のコーダーがこれを書いたとき、コードゴルフをやりすぎように思えます:)

于 2012-04-13T16:36:01.023 に答える