Нотация для логики в Java - PullRequest
       66

Нотация для логики в Java

7 голосов
/ 09 февраля 2012

Абсолютно простой вопрос Java, который мне трудно найти в Google. Что означает следующее:

(7 & 8) == 0?

Это эквивалентно написанию:

7 == 0 || 8 == 0?

Я написал краткое руководство, которое проверяет это, и, похоже, это так. Я просто хотел убедиться, что ничего не пропустил.

Ответы [ 5 ]

17 голосов
/ 09 февраля 2012

Неа.& равно поразрядно и .Он устанавливает бит, если соответствующие биты установлены на обоих входах.Поскольку в двоичном коде 7 - 111, а 8 - 1000, у них нет общих битов, поэтому результат равен 0.

На самом деле не существует сокращенного синтаксиса для того, что вы предлагаете, а не в одной строке.Есть несколько обходных путей - проверка на членство в Set или BitSet, использование оператора switch - но нет ничего более эффективного и короткого, чем 7 == 0 || 8 == 0.

10 голосов
/ 09 февраля 2012

& - поразрядное И.Учитывая два бита для входов, следующее дает битовый вывод поразрядным И:

0 & 0 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1

В этом случае

7 in binary is 00000111
8 in binary is 00001000
               --------
               00000000, which is 0 in decimal.

Скажем, у вас было 26 вместо 8.

 7 in binary is 00000111
26 in binary is 00011010
                --------
                00000010, which is 2 in decimal.

Битовые операции используются для извлечения и манипулирования полями, упакованными в число.

Например, скажем, у вас есть 3 поля, упакованные в одно число, два из 4 бит в каждом (0..15), один и 3 бита (0,7).

// n = aaaabbbbccc

// Unpack the fields:
a = (n >> 7) & 0xF;
b = (n >> 3) & 0xF;
c = (n >> 0) & 0x7;

// Pack the fields:
n = (a << 7)
  | (b << 3)
  | (c << 0);
4 голосов
/ 09 февраля 2012

& является побитовым оператором AND.Это означает, что вы AND ИЛИ биты, которые представляют 8 и 7:

7 -> 0111

8 -> 1000

Что очевидноприводит к 0.

Эта статья в википедии хорошо объясняет это на вашем конкретном примере, а также объясняет другие побитовые операторы.

3 голосов
/ 09 февраля 2012

& - это битовое сравнение, как уже упоминалось, но может также служить в качестве короткого замыкания "и". Например:

if((x == 3) &&  (y = 3/0)){

будет постоянно выдавать ошибку. Тем не менее,

if((x == 3) & (y = 3/0)){

выдаст ошибку только в том случае, если x равно 3. Если x не равно 3, java не будет беспокоиться об оценке остальных выражений, потому что False и что угодно будет False.

3 голосов
/ 09 февраля 2012

Это битовое сравнение, работает нормально, потому что вы сравниваете с 7 и 8, что не гарантируется в других случаях. Если оба бита в целых числах совпадают, вы получите результаты как «1», а не «0».

...