Google検索とスタックオーバーフローを使用して検索しようとしましたが、結果が表示されませんでした。私はこれをオープンソースのライブラリコードで見ました:
Notification notification = new Notification(icon, tickerText, when);
notification.defaults |= Notification.DEFAULT_SOUND;
notification.defaults |= Notification.DEFAULT_VIBRATE;
"| ="(pipe equal operator
)はどういう意味ですか?
|=
は+=
と同じように読みます。
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;
あなたはすでにあなたの質問に対して十分な答えを得ています。しかし、私の答えは|=
種類の二項演算子についてもっとあなたを助けるかもしれません。
私は ビット演算子 の表を書いています:
以下が有効です。
----------------------------------------------------------------------------------------
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=!B
はB
name__がtrue
name__である場合はA
name__がfalse
name__になることを意味します(そしてB
name__がfalse
name__である場合はA
name__はtrue
name__になります)。
サイドノート:|
はpipeとは呼ばれず、代わりにそのORと呼ばれ、pipeはシェルの用語を1つのプロセスから次のプロセスに転送します..
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
これは短くなります。
notification.defaults = notification.defaults | Notification.DEFAULT_SOUND;
そして|
はビットごとのORです。
|
は bitwise-or 演算子で、+=
のように適用されています。
注:|| =は存在しません。 (論理的または)あなたが使用することができます
y= y || expr; // expr is NOT evaluated if y==true
または
y = expr ? true : y; // expr is always evaluated.