Влияние побитового оператора на логическое значение в Java


побитовые операторы должны перемещать переменные и работать с ними бит за битом. В случае целых чисел, лонгов, символов это имеет смысл. Эти переменные могут содержать полный диапазон значений, задаваемых их размером.

в случае булевых значений, однако, булево может содержать только два значения. 1 = true или 0 = false. Но размер логического значения не определен. Это может быть как большой, как байт или бит.

Итак, каков эффект использования a побитовый оператор на булеве? JVM по существу переводит его в обычный логический оператор и движется дальше? Рассматривает ли он логическое значение как одноразрядную сущность для цели операции? Или результат не определен вместе с размером логического значения?

4 92

4 ответа:

операторы &, ^ и | являются побитовыми операторами, когда операнды являются примитивными целыми типами. Они являются логическими операторами, когда операнды являются булевыми, и их поведение в последнем случае указано. См. раздел 15.22.2 Спецификация Языка Java для сведения.

С помощью побитового оператора можно обойти поведение короткого замыкания:

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

если booleanExpression1() значение false, потом
booleanExpression2() не оценивается в первом случае и
booleanExpression2() (и какие бы побочные эффекты он ни имел)и оценивается во втором случае,

сверх того, что описано в других ответах, стоит отметить, что && и || имеют другой приоритет от & и |.

выписка из таблица приоритетов (С самым высоким приоритетом в верхней части).

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

что это значит для вас?

абсолютно ничего, пока вы придерживаетесь либо только & и | или только && и ||.

но, так как | имеет более высокий приоритет, чем && (вместо ||, который имеет более низкий приоритет), свободное смешивание их может привести к неожиданному поведению.

так a && b | c && d это то же самое, что a && (b | c) && d,
в отличие от a && b || c && d что будет (a && b) || (c && d).

чтобы доказать, что они не то же самое, рассмотрим выдержку из таблицы истинности:

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 -|

если вы хотите, или иметь более высокий приоритет, чем и вы может использовать | и && вместе, но это не рекомендуется.

но вы действительно должны помещать их в скобки, чтобы уточнить приоритет при использовании разных символов, т. е. (a && b) || c (скобки для уточнения приоритета), a && b && c (без скобок).

даже если она будет работать, вы не должны этого делать. Спецификации языка определяют побитовые операторы только тогда, когда оба операнда имеют примитивные целочисленные типы или оба имеют логический тип. Я бы сказал, что для любого другого случая результаты не определены:

http://java.sun.com/docs/books/jls/second_edition/html/expressions.doc.html#5228