Wpływ operatora bitowego na logikę w Javie

Operatory bitowe powinny przenosić zmienne i operować na nich bit po bitie. W przypadku liczb całkowitych, długich, znaków ma to sens. Zmienne te mogą zawierać pełen zakres wartości wymuszonych przez ich rozmiar.

W przypadku wartości logicznych, wartość logiczna może zawierać tylko dwie wartości. 1 = PRAWDA lub 0 = fałsz. Ale Rozmiar elementu logicznego nie jest zdefiniowany. Może być tak duży jak bajt lub tak mały.

Więc jaki jest efekt użycia operatora bitowego na boolean? Czy JVM zasadniczo Przekłada to na normalny operator logiczny i idzie dalej? Czy traktuje logikę logiczną jako pojedynczą jednostkę bitową na potrzeby operacji? A może wynik jest niezdefiniowany wraz z rozmiarem logiki?

Author: Daniel Bingham, 2009-11-12

4 answers

Operatory&, ^ i / są operatorami bitowymi, gdy operandy są prymitywnymi typami całkowymi. Są operatorami logicznymi, gdy operandy są boolowskie, a ich zachowanie w tym drugim przypadku jest określone. Szczegóły można znaleźć w sekcji 15.22.2 specyfikacji języka Java.

 96
Author: Noel Ang,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-16 02:41:00

Użycie operatora bitowego może obejść zachowanie zwarcia:

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

If booleanExpression1() evaluates to false, then
booleanExpression2() nie jest oceniana w pierwszym przypadku, oraz
booleanExpression2() (i jakiekolwiek skutki uboczne może mieć) jest oceniane w drugim przypadku,

 73
Author: mob,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-12 18:16:59

Poza tym, co zostało omówione w pozostałych odpowiedziach, warto zauważyć, że && i || mają inne pierwszeństwo od & i |.

Wyciąg z tabeli pierwszeństwa (z najwyższym pierwszeństwem na górze).

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

Co to dla ciebie znaczy?

Absolutnie nic, tak długo, jak trzymać się albo tylko & i | lub tylko && i ||.

Ale ponieważ | ma wyższą precendencję niż && (w przeciwieństwie do ||, która ma niższe pierwszeństwo), swobodne ich mieszanie może prowadzić do nieoczekiwanego zachowania.

Więc a && b | c && d jest tym samym co a && (b | c) && d,
w przeciwieństwie do a && b || c && d, które byłyby (a && b) || (c && d).

Aby udowodnić, że nie są takie same, rozważ wyciąg z tabeli prawdy:]}
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 -|

Jeśli chcesz lub chcesz mieć wyższy priorytet niż AND, możesz używać razem | i &&, ale nie jest to zalecane.

Ale naprawdę powinieneś umieścić je w nawiasach, aby wyjaśnić pierwszeństwo (a && b) || c (nawiasy dla wyjaśnienia pierwszeństwa), a && b && c (brak nawiasów).

 17
Author: Dukeling,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-22 16:31:45

Nawet jeśli to zadziała, nie powinieneś tego robić. Specyfikacje języka definiują operatory bitowe tylko wtedy, gdy oba operandy są prymitywnych typów całkowitych lub oba są typu boolean. 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

 2
Author: LeffeBrune,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-12 18:10:10