2009-11-12 11 views
87

Die bitweisen Operatoren sollen Variablen bewegen und sie bitweise bearbeiten. Im Fall von Ganzzahlen, Longs, Zeichen ist dies sinnvoll. Diese Variablen können den gesamten Wertebereich enthalten, der durch ihre Größe erzwungen wird.Auswirkung eines bitweisen Operators auf einen booleschen Wert in Java

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

Also, was ist der Effekt der Verwendung eines bitweisen Operators auf einem booleschen? Versetzt die JVM sie im Wesentlichen in einen normalen logischen Operator und geht weiter? Behandelt es den booleschen Wert als eine Ein-Bit-Entität für den Zweck der Operation? Oder ist das Ergebnis undefiniert mit der Größe eines booleschen Wertes?

+0

Ich denke, Sie können nicht einen bitweisen Operator auf einem booleschen verwenden. Nur für Zahlen. Ich bin mir sicher, ~ wird nicht funktionieren, ich weiß nicht, was mit anderen Betreibern. –

+4

Sie können einige von ihnen verwenden, wir haben gerade ein | entdeckt in unserem Legacy-Code verwendet. Wir entfernen es, aber dieser Code wurde kompiliert und funktioniert. –

+9

Da einer kurzgeschlossen ist und der andere nicht (siehe mobrules Antwort), bevor Sie den | zu || Vielleicht möchten Sie sicherstellen, dass die nachfolgenden booleschen Ausdrücke keine Nebenwirkungen haben, die der ursprüngliche Programmierer immer ausführen wollte. –

Antwort

91

Die Betreiber &,^und | sind bitweise Operatoren, wenn die Operanden primitive Integraltypen sind. Sie sind logische Operatoren, wenn die Operanden boolesch sind, und ihr Verhalten wird im letzteren Fall spezifiziert. Details finden Sie in Abschnitt 15.22.2 der Java Language Specification.

+38

Speziell, & und^und | sind die nicht-kurzgeschlossenen logischen booleschen Operatoren. – Ken

+12

Hier ist ein direkter Link zu dem oben genannten Abschnitt: http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.22.2 –

+0

Wenn das obige stimmt, warum http://ideone.com/oGSF7c wirft eine Nullzeigerausnahme? Wenn der Operator '| =' logisch wäre, hätte das Programm niemals die Anweisung 'x.getValue()' ausführen sollen. – ikromm

70

den bitweise-Operator kann einen Kurzschluss Verhalten umgehen:

boolean b = booleanExpression1() && booleanExpression2(); 
boolean b = booleanExpression1() & booleanExpression2(); 

Wenn booleanExpression1()-false auswertet, dann
booleanExpression2() nicht im ersten Fall ausgewertet wird, und
booleanExpression2() (und was auch immer Nebenwirkungen es haben kann) im zweiten Fall ausgewertet ist,

+2

Und die bitweise Operation führt normalerweise [schneller als die Kurzschlussschaltung] (http://stackoverflow.com/a/3076091/94363) aus (vorausgesetzt die Auswertung ist einfach) – rds

+0

Die bitweise '&' wird schneller, aber die Der Aufruf der zweiten Funktion könnte mit '&&' ignoriert werden – NatNgs

15

jenseits dessen, was in den anderen Antworten bedeckt ist, ist es wo rth merkt, dass && und || andere Priorität haben als & und |.

Auszug aus the precedence table (mit höchster Priorität an der Spitze).

bitwise AND     & 
bitwise exclusive OR  ^
bitwise inclusive OR  | 
logical AND     && 
logical OR     || 

Was bedeutet das für Sie?

Absolut nichts, solange Sie bleiben entweder nur & und | oder nur && und ||.

Aber da | hat eine höhere precendence als && (im Gegensatz zu || gegenüber, die eine geringere Priorität hat), frei Mischen sie zu unerwartetem Verhalten führen könnte.

So ist a && b | c && d die gleiche wie a && (b | c) && d,
zu a && b || c && d gegenüber, die (a && b) || (c && d) wäre.

Um zu beweisen, sie nicht gleich sind, einen Auszug aus der Wahrheitstabelle betrachten:

a | b | c | d | (b|c) | (a&&b) | (c&&d) | a && (b|c) && d | (a&&b) || (c&&d) 
F | T | T | T | T | F | T |   F  |  T 
               ^   ^
                |- not the same -| 

Wenn Sie oder auf eine höhere Priorität haben wollen, als AND, Sie konnte Verwendung | und && zusammen, aber Dies wird nicht empfohlen.

Aber Sie sollten wirklich in Klammern setzen, um die Präzedenz zu klären, wenn Sie verschiedene Symbole verwenden, d. H. (a && b) || c (Klammern, um die Priorität zu verdeutlichen), a && b && c (keine Klammern erforderlich).

Verwandte Themen