J'ai essayé de rechercher à l'aide de la recherche Google et du débordement de pile, mais aucun résultat n'a été affiché. J'ai vu cela dans le code de la bibliothèque open source:
Notification notification = new Notification(icon, tickerText, when);
notification.defaults |= Notification.DEFAULT_SOUND;
notification.defaults |= Notification.DEFAULT_VIBRATE;
Que signifie "| =" ( pipe equal operator
)?
pipe equal operator
à cette question ou toute autre documentation sur le sujet n'aiderait pas les gens à chercher.vertical bar
qui m'a finalement conduit ici.Réponses:
|=
se lit de la même manière que+=
.est le même que
où
|
est l'opérateur OU bit par bit.Tous les opérateurs sont référencés ici .
Un opérateur bit par bit est utilisé car, comme cela est fréquent, ces constantes permettent à un int de porter des drapeaux.
Si vous regardez ces constantes, vous verrez qu'elles ont deux puissances:
Vous pouvez donc utiliser des bits OU pour ajouter des indicateurs
alors
signifie simplement que nous ajoutons un drapeau.
Et symétriquement, nous testons un drapeau est défini en utilisant
&
:la source
j += 1;
est le même quej = j + 1;
.j
c'est le casvolatile
?), Mais je vais vous croire sur parole.boolean hasVibrate = DEFAULT_VIBRATE & myFlags;
- pouvez - vous traduire deint
de ceboolean
genre en Java? Ce serait valable en C, mais je pensais qu'en Java, cela devait être écrit commeboolean hasVibrate = ((DEFAULT_VIBRATE & myFlags) == DEFAULT_VIBRATE);
+=
finalement fait l'affaire pour que je le comprenne. Merci!Vous avez déjà obtenu une réponse suffisante à votre question. Mais peut-être que ma réponse vous aidera davantage au sujet des
|=
types d'opérateurs binaires.J'écris une table pour les opérateurs au niveau du bit : Les éléments suivants
sont valides:
notez que tous les opérateurs sont des opérateurs binaires.
Notez également : (pour les points ci-dessous, je voulais ajouter ma réponse)
>>>
est un opérateur au niveau du bit en Java qui est appelé décalage non signémais>>> = opérateur>>>=
pas un opérateur en Java.~
est un complément binaire,0 to 1 and 1 to 0
(opérateur unaire) mais~=
pas un opérateur.De plus,
!
appelé opérateur logique NON, mais!=
vérifie si la valeur de deux opérandes est égale ou non, si les valeurs ne sont pas égales, la condition devient vraie. par exemple(A != B) is true
. où commeA=!B
signifie siB
esttrue
alorsA
devenufalse
(et siB
estfalse
alorsA
devenutrue
).note de côté:
|
ne s'appelle pas pipe, au lieu de cela s'appelle OR, pipe est la terminologie du shell transférer un processus au suivant.la source
Je cherchais une réponse sur ce qui se
|=
passe dans Groovy et bien que les réponses ci-dessus soient exactes, elles ne m'ont pas aidé à comprendre un morceau de code particulier que je regardais.En particulier, lorsqu'elle est appliquée à une variable booléenne, "| =" la définira sur VRAI la première fois qu'elle rencontrera une expression véridique sur le côté droit et conservera sa valeur VRAIE pour tous les appels | | suivants. Comme un verrou.
Voici un exemple simplifié de ceci:
Production:
Edit : Pourquoi est-ce utile?
Considérez une situation où vous voulez savoir si quelque chose a changé sur une variété d'objets et si c'est le cas, notifiez l'une des modifications. Donc, vous configurez un
hasChanges
booléen et le définissez sur|= diff (a,b)
, puis|= dif(b,c)
etc. Voici un bref exemple:la source
y|=expr
n'est pas un court-circuit (contrairementy = y || expr
), ce qui signifie qu'elle estexpr
toujours évaluée. Ce n'était pas évident pour moi pour la première fois :) Il est donc important de noter avant de refactoriser que le remplacementy|=expr
↔y=y||x
n'est pas sémantiquement équivalent au cas où ilexpr
y aurait effectivement des effets secondaires.hasChanges
ce serait sans doute préférable de préférer lay=y||x
forme au profit de court ciruit, parce que quand vous avez trouvé tout changement , il est pas vraiment nécessaire de faire diffs susequent parce que vous connaissez déjà la réponse. (Particulièrement important dans la situation de la vie réelle lorsque les objets comparés sont compliqués etdiff
les intégrer n'est pas assez rapide)||
et&&
, et dans les sections correspondantes 15,23 et 15,24 de la spécification de ce fait est clairement déclarée, et cette différence|
et&
est soulignée.||=
et&&=
qui enfreindre la règle et exiger une mention spéciale).C'est un raccourcissement pour cela:
Et
|
est un peu OU.la source
|
est l' opérateur ou au niveau du bit , et il est appliqué comme+=
.la source
Remarque: || = n'existe pas. (logique ou) Vous pouvez utiliser
ou
la source
y |= expr
avec des booléens et cela donne le même résultaty
que vos variantes avec la note importante qu'il n'est pas court-circuité , ce qui signifie que expr est toujours évalué, même en cas dey==true