web-dev-qa-db-ja.com

"| ="はどういう意味ですか? (パイプ等価演算子)

Google検索とスタックオーバーフローを使用して検索しようとしましたが、結果が表示されませんでした。私はこれをオープンソースのライブラリコードで見ました:

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

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

184
wtsang02

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

notification.defaults |= Notification.DEFAULT_SOUND;

と同じです

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

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

すべての演算子が参照されます ここ

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

これらの定数を look とすると、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;
254
Denys Séguret

あなたはすでにあなたの質問に対して十分な答えを得ています。しかし、私の答えは|=種類の二項演算子についてもっとあなたを助けるかもしれません。

私は ビット演算子 の表を書いています:
以下が有効です。

----------------------------------------------------------------------------------------
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つのオペランドの値が等しいかどうかをチェックし、値が等しくない場合はconditionがtrueになります。例えば(A != B) is true。ここで、A=!BBname__がtruename__である場合はAname__がfalsename__になることを意味します(そしてBname__がfalsename__である場合はAname__はtruename__になります)。

サイドノート:|はpipeとは呼ばれず、代わりにそのORと呼ばれ、pipeはシェルの用語を1つのプロセスから次のプロセスに転送します..

33
Grijesh Chauhan

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

編集:これはなぜ便利なのですか?

さまざまなオブジェクトで何かが変更されたかどうかを知りたい場合は、変更のうちの1つを通知します。そのため、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
13
dbrin

これは短くなります。

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

そして|はビットごとのORです。

12
Till Helge

|bitwise-or 演算子で、+=のように適用されています。

8
ford

注:|| =は存在しません。 (論理的または)あなたが使用することができます

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

または

y = expr ? true : y;  // expr is always evaluated.
2
woens