Se supone que los operadores bit a bit viajan variables y operan sobre ellas bit a bit. En el caso de enteros, largos, caracteres, esto tiene sentido. Estas variables pueden contener la gama completa de valores exigidos por su tamaño.
En el caso de los valores booleanos, sin embargo, un booleano puede contener solo dos valores. 1 = verdadero o 0 = falso. Pero el tamaño del booleano no está definido. Puede ser tan grande como un byte o tan pequeño como un bit.
Entonces, ¿cuál es el efecto de usar un operador bit a bit en un booleano? ¿La JVM esencialmente lo traduce a un operador lógico normal y sigue adelante? ¿Trata el booleano como una entidad de un solo bit para el propósito de la operación? ¿O el resultado no está definido junto con el tamaño de un booleano?
fuente
Respuestas:
Los operadores
&
,^
y|
son operadores bit a bit cuando los operandos son tipos integrales primitivos. Son operadores lógicos cuando los operandos son booleanos y se especifica su comportamiento en el último caso. Consulte la sección 15.22.2 de la Especificación del lenguaje Java para obtener más detalles.fuente
|=
operador era lógico, el programa nunca debería haber ejecutado lax.getValue()
directiva.a || x.foo()
es seguro si x es nulo, peroa | x.foo()
no lo es.|=
sigue las mismas reglas que|
.El uso del operador bit a bit puede evitar el comportamiento de cortocircuito:
Si
booleanExpression1()
evalúa afalse
, entoncesbooleanExpression2()
no se evalúa en el primer caso ybooleanExpression2()
(y los efectos secundarios que pueda tener) se evalúa en el segundo caso,fuente
&
a bit será más rápido, pero la llamada a la segunda función podría ignorarse con el uso de&&
Más allá de lo que está cubierto en las otras respuestas, vale la pena señalar que
&&
y||
tienen precedencia diferente de&
y|
.Extracto de la tabla de precedencia (con mayor precedencia en la parte superior).
¿Qué significa esto para ti?
Absolutamente nada, siempre y cuando te ciñas a solo
&
y|
o solo&&
y||
.Pero, dado que
|
tiene una mayor precendencia que&&
(a diferencia de||
, que tiene una menor precedencia), mezclarlos libremente podría conducir a un comportamiento inesperado.Entonces
a && b | c && d
es lo mismo quea && (b | c) && d
,en contraposición a lo
a && b || c && d
que sería(a && b) || (c && d)
.Para demostrar que no son iguales, considere un extracto de la tabla de verdad:
Si desea que OR tenga mayor precedencia que AND, puede usar
|
y&&
juntos, pero esto no se recomienda.Pero realmente debería ponerlos entre corchetes para aclarar la precedencia siempre que use diferentes símbolos, es decir
(a && b) || c
(corchetes para aclarar la precedencia),a && b && c
(no se necesitan corchetes).fuente
Incluso si funciona, no debería hacerlo. Las especificaciones del lenguaje definen operadores bit a bit solo cuando ambos operandos son de tipo entero primitivo o ambos son de tipo booleano. Diría que para cualquier otro caso los resultados no están definidos:
http://java.sun.com/docs/books/jls/second_edition/html/expressions.doc.html#5228
fuente