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

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

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

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

95 голосов | спросил Daniel Bingham 12 42009vEurope/Moscow11bEurope/MoscowThu, 12 Nov 2009 21:01:54 +0300 2009, 21:01:54

3 ответа


0

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

ответил Noel Ang 12 42009vEurope/Moscow11bEurope/MoscowThu, 12 Nov 2009 21:11:34 +0300 2009, 21:11:34
0

Использование побитового оператора может обойти короткое замыкание:

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

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

ответил mob 12 42009vEurope/Moscow11bEurope/MoscowThu, 12 Nov 2009 21:16:59 +0300 2009, 21:16:59
0

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

Извлечь из таблицу приоритетов (с самым высоким приоритетом вверху).

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

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

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

ответил Dukeling 22 PM00000080000004531 2013, 20:31:45

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132