Operatory bitowe mają przemieszczać zmienne i operować na nich bit po bicie. W przypadku liczb całkowitych, długich i znaków ma to sens. Te zmienne mogą zawierać pełen zakres wartości wymuszonych przez ich rozmiar.
Jednak w przypadku logicznych wartości logicznych może zawierać tylko dwie wartości. 1 = prawda lub 0 = fałsz. Ale rozmiar logicznej nie jest zdefiniowany. Może być tak duży jak bajt lub mały.
Więc jaki jest efekt użycia operatora bitowego na boolowskim? Czy wirtualna maszyna Java zasadniczo przekłada to na normalnego operatora logicznego i idzie dalej? Czy na potrzeby operacji traktuje wartość logiczną jako jednostkę jednobitową? A może wynik jest niezdefiniowany wraz z rozmiarem wartości logicznej?
java
boolean
bitwise-operators
Daniel Bingham
źródło
źródło
Odpowiedzi:
Operatory
&
,^
i|
są operatorami bitowymi, gdy operandy są pierwotnymi typami całkowitymi. Są operatorami logicznymi, gdy operandy są logiczne, a ich zachowanie w tym drugim przypadku jest określone. Szczegółowe informacje zawiera sekcja 15.22.2 specyfikacji języka Java .źródło
|=
operator był logiczny, program nigdy nie powinien był uruchamiaćx.getValue()
dyrektywy.a || x.foo()
jest bezpieczne, jeśli x jest zerowe, alea | x.foo()
nie jest.|=
przestrzega tych samych zasad, co|
.Użycie operatora bitowego może obejść zachowanie polegające na zwarciu:
Jeśli
booleanExpression1()
oceniafalse
,booleanExpression2()
to nie jest oceniany w pierwszym przypadku ibooleanExpression2()
(i wszelkie skutki uboczne, jakie może mieć) jest oceniany w drugim przypadku,źródło
&
będzie szybsze, ale wywołanie drugiej funkcji można zignorować za pomocą&&
Poza tym, co zostało omówione w innych odpowiedziach, warto to zauważyć
&&
i||
mieć inny priorytet niż&
i|
.Wyciąg z tabeli priorytetów (z najwyższym priorytetem na górze).
Co to dla ciebie oznacza?
Absolutnie nic, o ile trzymasz się tylko
&
i|
lub tylko&&
i||
.Ale ponieważ
|
ma wyższy priorytet niż&&
(w przeciwieństwie do||
, który ma niższy priorytet), ich swobodne mieszanie może prowadzić do nieoczekiwanego zachowania.Więc
a && b | c && d
to to samoa && (b | c) && d
,w przeciwieństwie do tego,
a && b || c && d
które byłoby(a && b) || (c && d)
.Aby udowodnić, że to nie to samo, rozważ wyciąg z tabeli prawdy:
Jeśli chcesz lub mają wyższy priorytet niż I, mogłyby korzystać
|
i&&
razem, ale nie jest to zalecane.Ale naprawdę powinieneś umieścić je w nawiasach, aby wyjaśnić pierwszeństwo za każdym razem, gdy używasz różnych symboli, tj.
(a && b) || c
(Nawiasy wyjaśniające pierwszeństwo),a && b && c
(nie są potrzebne nawiasy).źródło
Nawet jeśli to zadziała, nie powinieneś tego robić. Specyfikacje języka definiują operatory bitowe tylko wtedy, gdy oba operandy są typu pierwotnych liczb całkowitych lub oba są typu boolowskiego. Powiedziałbym, że dla każdego innego przypadku wyniki nie są zdefiniowane:
http://java.sun.com/docs/books/jls/second_edition/html/expressions.doc.html#5228
źródło