Wat betekent “|=”? (operator voor gelijke pijplijn)

Ik heb geprobeerd te zoeken met Google Zoeken en Stack Overflow, maar er werden geen resultaten weergegeven. Ik heb dit gezien in opensource bibliotheekcode:

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

Wat betekent “|=” ( pipe equal operator)?


Antwoord 1, autoriteit 100%

|=leest op dezelfde manier als +=.

notification.defaults |= Notification.DEFAULT_SOUND;

is hetzelfde als

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

waar |de bitsgewijze OR-operator is.

Alle operators worden hiervermeld.

Een bitsgewijze operator wordt gebruikt omdat, zoals vaak, deze constanten een int in staat stellen om vlaggen te dragen.

Als je kijknaar die constanten, je zult zien dat ze in machten van twee zijn:

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

Je kunt dus bitgewijs OR gebruiken om vlaggen toe te voegen

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

dus

myFlags |= DEFAULT_LIGHTS;

betekent gewoon dat we een vlag toevoegen.

en symmetrisch, we testen een vlag is ingesteld met &:

boolean hasVibrate = (DEFAULT_VIBRATE & myFlags) != 0;

Antwoord 2, Autoriteit 12%

U hebt al voldoende antwoord voor uw vraag. Maar kan mijn antwoord zijn, helpen u meer over |=soort binaire operators.

Ik schrijf tabel voor bitwise operators :
Volgende zijn geldig:

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

OPMERKING Alle operators zijn binaire operators.

Ook Opmerking:(voor onderstaande punten wilde ik mijn antwoord toevoegen)

  • >>>is een bitsgewijze operator in Java die Unsigned shift
    wordt genoemd
    maar >>>=geen operator in Java.>>>= operator

  • ~is bitsgewijze complementaire bits, 0 to 1 and 1 to 0(Unaire operator) maar ~=geen operator .

  • Bovendien !Logische NOT-operator genoemd, maar !=Controleert of de waarde van twee operanden gelijk is of niet, als de waarden niet gelijk zijn, dan voorwaarde wordt waar. bijv. (A != B) is true. waarbij A=!Bbetekent dat als Btrueis, Afalsewordt (en als Bfalseis, dan wordt Atrue).

kanttekening: |wordt niet pipe genoemd, in plaats daarvan wordt het OR genoemd, pipe is shell-terminologie om het ene proces naar het volgende over te dragen..


Antwoord 3, autoriteit 6%

Ik was op zoek naar een antwoord op wat |=doet in Groovy en hoewel bovenstaande antwoorden juist zijn, hebben ze me niet geholpen een bepaald stuk code te begrijpen waar ik naar keek.

In het bijzonder, wanneer toegepast op een booleaanse variabele, zal “|=” deze op TRUE zetten de eerste keer dat het een waarheidsgetrouwe expressie aan de rechterkant tegenkomt en zal de TRUE-waarde HOLD voor alle |= volgende aanroepen. Als een grendel.

Hier een vereenvoudigd voorbeeld hiervan:

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 

Uitgang:

false
false
true
true

Bewerken :
Waarom is dit nuttig?

Overweeg een situatie waarin u wilt weten of er iets is gewijzigd op verschillende objecten en indien u een van de wijzigingen informeert. Dus, u zou een hasChangesBoolean instellen en instellen op |= diff (a,b)en dan |= dif(b,c)etc.
Hier is een kort voorbeeld:

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

Antwoord 4, Autoriteit 4%

Het is hiervoor een verkorting:

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

en |is een beetje of.


Antwoord 5, Autoriteit 3%

|is de bitwise-of operator, en het wordt toegepast +=.


Antwoord 6

Opmerking: || = bestaat niet. (logisch of)
U kunt

gebruiken

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

of

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

Other episodes