Die bitweisen Operatoren sollen Variablen übertragen und Stück für Stück bearbeiten. Bei ganzen Zahlen, Longs und Zeichen ist dies sinnvoll. Diese Variablen können den gesamten Wertebereich enthalten, der durch ihre Größe erzwungen wird.
Bei Booleschen Werten kann ein Boolescher Wert jedoch nur zwei Werte enthalten. 1 = wahr oder 0 = falsch. Die Größe des Booleschen Werts ist jedoch nicht definiert. Es kann so groß wie ein Byte oder so klein wie ein bisschen sein.
Wie wirkt sich die Verwendung eines bitweisen Operators auf einen Booleschen Wert aus? Übersetzt die JVM sie im Wesentlichen in einen normalen logischen Operator und fährt fort? Behandelt es den Booleschen Wert für die Operation als Einzelbit-Entität? Oder ist das Ergebnis zusammen mit der Größe eines Booleschen Werts undefiniert?
quelle
Antworten:
Die Operatoren
&
,^
und|
sind bitweise Operatoren, wenn die Operanden primitive Integraltypen sind. Sie sind logische Operatoren, wenn die Operanden boolesch sind, und ihr Verhalten im letzteren Fall wird angegeben. Weitere Informationen finden Sie in Abschnitt 15.22.2 der Java-Sprachspezifikation .quelle
|=
Operator logisch war, sollte das Programm diex.getValue()
Direktive niemals ausgeführt haben .a || x.foo()
Ist also sicher, wenn x null ist, abera | x.foo()
nicht.|=
folgt den gleichen Regeln wie|
.Die Verwendung des bitweisen Operators kann das Kurzschlussverhalten umgehen:
Wenn
booleanExpression1()
bewertetfalse
,booleanExpression2()
wird im ersten Fall nicht bewertet, undbooleanExpression2()
(und welche Nebenwirkungen es auch haben mag) wird im zweiten Fall bewertet.quelle
&
wird schneller sein, aber der Aufruf der zweiten Funktion könnte mit der Verwendung von&&
Darüber hinaus , was in den anderen Antworten bedeckt ist, unter Hinweis darauf , es wert ist, dass
&&
und||
haben unterschiedliche Priorität von&
und|
.Auszug aus der Prioritätstabelle (mit der höchsten Priorität oben).
Was bedeutet das für Sie?
Absolut nichts, solange Sie sich entweder nur
&
und|
oder nur&&
und halten||
.Da sie jedoch
|
eine höhere Priorität haben als&&
(im Gegensatz zu einer||
niedrigeren Priorität), kann das freie Mischen zu unerwartetem Verhalten führen.So
a && b | c && d
ist das gleiche wiea && (b | c) && d
,im Gegensatz zu
a && b || c && d
dem , was wäre(a && b) || (c && d)
.Um zu beweisen, dass sie nicht gleich sind, betrachten Sie einen Auszug aus der Wahrheitstabelle:
Wenn Sie wollen oder eine höhere Priorität haben als AND, Sie könnten nutzen
|
und&&
zusammen, aber dies wird nicht empfohlen.Aber Sie sollten sie wirklich in Klammern setzen, um die Priorität zu verdeutlichen, wenn Sie verschiedene Symbole verwenden, dh
(a && b) || c
(Klammern, um die Priorität zu verdeutlichen)a && b && c
(keine Klammern erforderlich).quelle
Auch wenn es funktionieren wird, sollten Sie es nicht tun. Sprachspezifikationen definieren bitweise Operatoren nur, wenn beide Operanden vom primitiven Integer-Typ oder beide vom Booleschen Typ sind. Ich würde für jeden anderen Fall sagen, dass die Ergebnisse nicht definiert sind:
http://java.sun.com/docs/books/jls/second_edition/html/expressions.doc.html#5228
quelle