Os operadores bit a bit devem viajar pelas variáveis e operá-las bit a bit. No caso de inteiros, longos, chars, isso faz sentido. Essas variáveis podem conter toda a gama de valores impostos por seu tamanho.
No caso de booleanos, entretanto, um booleano pode conter apenas dois valores. 1 = verdadeiro ou 0 = falso. Mas o tamanho do booleano não está definido. Pode ser tão grande quanto um byte ou tão pequeno quanto um bit.
Então, qual é o efeito de usar um operador bit a bit em um booleano? A JVM essencialmente o traduz para um operador lógico normal e segue em frente? Ele trata o booleano como uma entidade de bit único para o propósito da operação? Ou o resultado é indefinido junto com o tamanho de um booleano?
java
boolean
bitwise-operators
Daniel Bingham
fonte
fonte
Respostas:
Os operadores
&
,^
e|
são operadores bit a bit quando os operandos são tipos integrais primitivos. Eles são operadores lógicos quando os operandos são booleanos e seu comportamento no último caso é especificado. Consulte a seção 15.22.2 da Especificação da linguagem Java para obter detalhes.fonte
|=
operador fosse lógico, o programa nunca deveria ter executado ax.getValue()
diretiva.a || x.foo()
é seguro se x for nulo, masa | x.foo()
não é.|=
segue as mesmas regras que|
.Usar o operador bit a bit pode contornar o comportamento de curto-circuito:
Se for
booleanExpression1()
avaliado comofalse
,booleanExpression2()
não será avaliado no primeiro caso ebooleanExpression2()
(e quaisquer efeitos colaterais que possa ter) será avaliado no segundo caso,fonte
&
será mais rápido, mas a chamada para a segunda função pode ser ignorada com o uso de&&
Além do que foi abordado nas outras respostas, é importante notar que
&&
e||
têm precedência diferente de&
e|
.Extraia da tabela de precedência (com a precedência mais alta no topo).
O que isso significa para você?
Absolutamente nada, contanto que você se atenha a apenas
&
e|
ou apenas&&
e||
.Mas, uma vez que
|
tem uma precedência mais alta do que&&
(em oposição a||
, que tem uma precedência mais baixa), misturá-los livremente pode levar a um comportamento inesperado.Então
a && b | c && d
é o mesmo quea && (b | c) && d
,ao contrário do
a && b || c && d
que seria(a && b) || (c && d)
.Para provar que eles não são iguais, considere um extrato da tabela verdade:
Se você quiser que OR tenha precedência maior do que AND, poderá usar
|
e&&
junto, mas isso não é recomendado.Mas você realmente deve colocá-los entre colchetes para esclarecer a precedência sempre que usar símbolos diferentes, ou seja,
(a && b) || c
(colchetes para esclarecer a precedência),a && b && c
(não são necessários colchetes).fonte
Mesmo que funcione, você não deve fazer isso. As especificações da linguagem definem operadores bit a bit apenas quando ambos os operandos são de tipos inteiros primitivos ou ambos são do tipo booleano. Eu diria que para qualquer outro caso os resultados não estão definidos:
http://java.sun.com/docs/books/jls/second_edition/html/expressions.doc.html#5228
fonte