Побитовые операторы должны перемещать переменные и оперировать с ними бит за битом. В случае с целыми числами, длинными, символами это имеет смысл. Эти переменные могут содержать полный диапазон значений, зависящих от их размера.
Однако в случае логических значений логическое значение может содержать только два значения. 1 = истина или 0 = ложь. Но размер логического значения не определен. Он может быть большим, как байт, или совсем маленьким.
Итак, каков эффект использования побитового оператора для логического значения? Преобразует ли JVM его в обычный логический оператор и двигается ли дальше? Обрабатывает ли он логическое значение как одноразрядный объект для операции? Или результат не определен вместе с размером логического?
java
boolean
bitwise-operators
Дэниел Бингэм
источник
источник
Ответы:
Операторы
&
,^
и|
являются побитовыми операторами, если операнды являются примитивными целочисленными типами. Они являются логическими операторами, когда операнды являются логическими, и их поведение в последнем случае указано. См. Подробности в разделе 15.22.2 Спецификации языка Java .источник
|=
оператор был логичным, программа никогда не должна была запускатьx.getValue()
директиву.a || x.foo()
что безопасно, если x равно нулю, ноa | x.foo()
это не так.|=
следует тем же правилам, что и|
.Использование побитового оператора позволяет избежать короткого замыкания:
Если имеет
booleanExpression1()
значениеfalse
, тоbooleanExpression2()
не оценивается в первом случае, иbooleanExpression2()
(и независимо от побочных эффектов может быть) будет оцениваться во втором случае,источник
&
будет быстрее, но вызов второй функции можно проигнорировать с помощью&&
Помимо того, что описано в других ответах, стоит отметить это
&&
и||
иметь другой приоритет от&
и|
.Выдержка из таблицы приоритетов (с наивысшим приоритетом вверху).
Что это значит для тебя?
Абсолютно ничего, пока вы придерживаетесь либо only
&
and,|
либо only&&
and||
.Но поскольку
|
имеет более высокий приоритет, чем&&
(в отличие от||
, который имеет более низкий приоритет), их свободное смешивание может привести к неожиданному поведению.Так
a && b | c && d
это же , какa && (b | c) && d
,в отличие от
a && b || c && d
которых было бы(a && b) || (c && d)
.Чтобы доказать, что это не одно и то же, рассмотрим выдержку из таблицы истинности:
Если вы хотите, чтобы OR имел более высокий приоритет, чем AND, вы можете использовать
|
и&&
вместе, но это не рекомендуется.Но вам действительно следует заключать их в скобки, чтобы прояснить приоритет при использовании разных символов, например
(a && b) || c
(скобки для уточнения приоритета)a && b && c
(скобки не нужны).источник
Даже если это сработает, не стоит этого делать. Спецификации языка определяют побитовые операторы только тогда, когда оба операнда имеют примитивные целочисленные типы или оба имеют логический тип. Я бы сказал, что для любого другого случая результаты не определены:
http://java.sun.com/docs/books/jls/second_edition/html/expressions.doc.html#5228
источник