317

Google 検索と Stack Overflow で検索してみましたが、結果が表示されませんでした。私はこれをオープンソースライブラリコードで見ました:

Notification notification = new Notification(icon, tickerText, when);
notification.defaults |= Notification.DEFAULT_SOUND;
notification.defaults |= Notification.DEFAULT_VIBRATE;

"|=" ( pipe equal operator) とはどういう意味ですか?

4

6 に答える 6

399

|=と同じように読みます+=

notification.defaults |= Notification.DEFAULT_SOUND;

と同じです

notification.defaults = notification.defaults | Notification.DEFAULT_SOUND;

ここ|で、ビット単位の OR 演算子です。

すべての演算子はここで参照されます。

ビット単位の演算子が使用されるのは、よくあることですが、これらの定数によって int がフラグを運ぶことができるためです。

これらの定数を見ると、2 の累乗になっていることがわかります。

public static final int DEFAULT_SOUND = 1;
public static final int DEFAULT_VIBRATE = 2; // is the same than 1<<1 or 10 in binary
public static final int DEFAULT_LIGHTS = 4; // is the same than 1<<2 or 100 in binary

したがって、ビット単位の OR を使用してフラグを追加できます

int myFlags = DEFAULT_SOUND | DEFAULT_VIBRATE; // same as 001 | 010, producing 011

それで

myFlags |= DEFAULT_LIGHTS;

単にフラグを追加することを意味します。

そして対称的に、次を使用してフラグが設定されていることをテストし&ます。

boolean hasVibrate = (DEFAULT_VIBRATE & myFlags) != 0;
于 2013-01-12T16:44:13.760 に答える
46

あなたの質問に対する十分な回答がすでに得られています。|=しかし、二項演算子の種類 については、私の答えが役立つかもしれません。

私はビットごとの演算子のテーブルを書いています:
以下は有効です:

----------------------------------------------------------------------------------------
Operator   Description                                   Example
----------------------------------------------------------------------------------------
|=        bitwise inclusive OR and assignment operator   C |= 2 is same as C = C | 2
^=        bitwise exclusive OR and assignment operator   C ^= 2 is same as C = C ^ 2
&=        Bitwise AND assignment operator                C &= 2 is same as C = C & 2
<<=       Left shift AND assignment operator             C <<= 2 is same as C = C << 2
>>=       Right shift AND assignment operator            C >>= 2 is same as C = C >> 2  
----------------------------------------------------------------------------------------

すべての演算子は二項演算子であることに注意してください。

また、注:( 以下の点については、回答を追加したかった)

  • >>>符号なしシフトと呼ばれる Java のビット演算子です。
    ただし >>>=、Java の演算子ではありません。 >>>= 演算子

  • ~ビットごとの補数ビット0 to 1 and 1 to 0(単項演算子) ですが~=、演算子ではありません。

  • さらに、 !論理 NOT 演算子と呼ば!=れますが、2 つのオペランドの値が等しいかどうかをチェックし、値が等しくない場合は条件が true になります。例えば(A != B) is true。where asA=!Bは if Bis truethen Abecomeを意味しますfalse(そして if Bis falsethen Abecome true)。

補足:|パイプとは呼ばれません。代わりに OR と呼ばれます。パイプはシェル用語で、1 つのプロセスを次のプロセスに転送します。

于 2013-01-12T18:33:17.913 に答える
26

私は|=Groovyで何をするかについての答えを探していました.上記の答えは正しいですが、私が見ている特定のコードを理解するのに役立ちませんでした.

特に、ブール変数 "|=" に適用すると、右側に真の式が初めて出現したときに TRUE に設定され、その後のすべての |= 呼び出しでその TRUE 値が保持されます。ラッチのように。

これを単純化した例を次に示します。

groovy> boolean result  
groovy> //------------ 
groovy> println result           //<-- False by default
groovy> println result |= false 
groovy> println result |= true   //<-- set to True and latched on to it
groovy> println result |= false 

出力:

false
false
true
true

編集:なぜこれが役立つのですか?

さまざまなオブジェクトで何かが変更されたかどうかを知りたい状況を考えてみましょう。変更された場合は、変更のいずれかを通知します。したがって、hasChangesブール値を設定して |= diff (a,b)、それを次に設定します|= dif(b,c)。簡単な例を次に示します。

groovy> boolean hasChanges, a, b, c, d 
groovy> diff = {x,y -> x!=y}  
groovy> hasChanges |= diff(a,b) 
groovy> hasChanges |= diff(b,c) 
groovy> hasChanges |= diff(true,false) 
groovy> hasChanges |= diff(c,d) 
groovy> hasChanges 

Result: true
于 2015-12-14T19:15:05.300 に答える
15

これは短縮されています:

notification.defaults = notification.defaults | Notification.DEFAULT_SOUND;

And|はビットごとの OR です。

于 2013-01-12T16:44:34.750 に答える
10

|ビット単位の演算子であり、のように適用され+=ます。

于 2013-01-12T16:45:44.000 に答える
4

注: ||= は存在しません。(論理または)使用できます

y= y || expr; // expr is NOT evaluated if y==true

また

y = expr ? true : y;  // expr is always evaluated.
于 2015-06-27T22:06:11.027 に答える