Ich habe versucht, mit der Google-Suche und dem Stapelüberlauf zu suchen, aber es wurden keine Ergebnisse angezeigt. Ich habe dies im OpenSource-Bibliothekscode gesehen:
Notification notification = new Notification(icon, tickerText, when);
notification.defaults |= Notification.DEFAULT_SOUND;
notification.defaults |= Notification.DEFAULT_VIBRATE;
Was bedeutet "| =" ( pipe equal operator
)?
pipe equal operator
zu dieser Frage oder einer anderen Dokumentation zu diesem Thema den Leuten bei der Suche nicht helfen würde.vertical bar
der mich schließlich hierher führte.Antworten:
|=
liest sich genauso wie+=
.ist das gleiche wie
Wo
|
ist der bitweise ODER-Operator?Alle Operatoren werden hier referenziert .
Ein bitweiser Operator wird verwendet, da diese Konstanten, wie häufig, es einem int ermöglichen, Flags zu tragen.
Wenn Sie sich diese Konstanten ansehen , werden Sie feststellen, dass sie Zweierpotenzen haben:
Sie können also bitweises ODER verwenden, um Flags hinzuzufügen
so
bedeutet einfach, dass wir eine Flagge hinzufügen.
Und symmetrisch testen wir, ob ein Flag gesetzt ist mit
&
:quelle
j += 1;
ist das gleiche wiej = j + 1;
.j
istvolatile
?), Aber ich werde dafür Wort nehmen.boolean hasVibrate = DEFAULT_VIBRATE & myFlags;
- können Sie von übersetzenint
zuboolean
wie in Java? Das wäre in C gültig, aber ich dachte, in Javaboolean hasVibrate = ((DEFAULT_VIBRATE & myFlags) == DEFAULT_VIBRATE);
+=
hat mir endlich geholfen, es zu verstehen. Vielen Dank!Sie haben bereits eine ausreichende Antwort auf Ihre Frage. Aber vielleicht hilft Ihnen meine Antwort mehr über die
|=
Art der binären Operatoren.Ich schreibe eine Tabelle für bitweise Operatoren :
Folgendes ist gültig:
Beachten Sie, dass alle Operatoren binäre Operatoren sind.
Auch Anmerkung: (für unten Punkte Ich wollte meine Antwort hinzufügen)
>>>
ist ein bitweiser Operator in Java, der als vorzeichenlose Verschiebung bezeichnet wirdaber>>> = Operator>>>=
kein Operator in Java.~
ist bitweise Komplementbits0 to 1 and 1 to 0
(unärer Operator), aber~=
kein Operator.Zusätzlich als
!
logischer NICHT-Operator bezeichnet,!=
prüft jedoch, ob der Wert von zwei Operanden gleich ist oder nicht. Wenn die Werte nicht gleich sind, wird die Bedingung wahr. zB(A != B) is true
. wobei alsA=!B
Mittel , wennB
ist ,true
dannA
werdenfalse
(und wennB
ist ,false
dannA
werdentrue
).Randnotiz:
|
heißt nicht Pipe, sondern heißt OR, Pipe ist Shell-Terminologie. Übertragen Sie einen Prozess zum nächsten.quelle
Ich suchte nach einer Antwort auf das, was
|=
in Groovy funktioniert, und obwohl die obigen Antworten richtig sind, haben sie mir nicht geholfen, einen bestimmten Code zu verstehen, den ich mir angesehen habe.Insbesondere wenn es auf eine boolesche Variable angewendet wird, setzt "| =" sie auf TRUE, wenn sie zum ersten Mal auf einen wahrheitsgemäßen Ausdruck auf der rechten Seite trifft, und hält ihren TRUE-Wert für alle nachfolgenden Aufrufe | =. Wie ein Riegel.
Hier ein vereinfachtes Beispiel dafür:
Ausgabe:
Edit : Warum ist das nützlich?
Stellen Sie sich eine Situation vor, in der Sie wissen möchten, ob sich an einer Vielzahl von Objekten etwas geändert hat, und benachrichtigen Sie in diesem Fall eine der Änderungen. Sie würden also einen
hasChanges
Booleschen Wert einrichten und ihn auf|= diff (a,b)
und dann|= dif(b,c)
usw. setzen. Hier ein kurzes Beispiel:quelle
y|=expr
ist nicht kurzgeschlossen werden ( im Gegensatz zuy = y || expr
), was bedeutet , dassexpr
immer ausgewertet. Das war nicht offensichtlich für mich zum ersten Mal :) So ist es wichtig zu beachten ist , vor , dass der Ersatz Refactoringy|=expr
↔y=y||x
ist nicht semantisch äquivalent , fallsexpr
Nebenwirkungen tatsächlich hat.hasChanges
es wäre wahrscheinlich besser, liebey=y||x
Form profitiert von Kurz ciruit, denn wenn Sie eine Veränderung gefunden wird es nicht wirklich susequent diffs tun muß , weil Sie bereits die Antwort wissen. (Besonders wichtig in der realen Lebenssituation, wenn verglichene Objekte kompliziert sind unddiff
es nicht ganz schnell geht)||
und&&
, und in den entsprechenden Abschnitten 15.23 und 15.24 der Spezifikation wird diese Tatsache klar erklärt und dieser Unterschied zu|
und&
hervorgehoben.||=
und&&=
Operatoren, die dies tun würden gegen die Regel verstoßen und besondere Erwähnung erfordern).Es ist eine Verkürzung dafür:
Und
|
ist ein bisschen weise ODER.quelle
|
ist der bitweise-oder- Operator und wird wie angewendet+=
.quelle
Hinweis: || = existiert nicht. (logisch oder) Sie können verwenden
oder
quelle
y |= expr
mit Booleschen Werten arbeiten und es gibt das gleiche Ergebnisy
wie bei Ihren Varianten mit dem wichtigen Hinweis, dass es kein Kurzschluss ist , was bedeutet, dass Ausdruck immer ausgewertet wird, auch im Fall vony==true