Обозначение логики в Java

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

(7 & 8) == 0?

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

7 == 0 || 8 == 0?

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


person Sal    schedule 08.02.2012    source источник


Ответы (5)


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

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

person Louis Wasserman    schedule 08.02.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);
person ikegami    schedule 08.02.2012

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

7 -> 0111

8 -> 1000

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

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

person jbranchaud    schedule 08.02.2012

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

person kosa    schedule 08.02.2012

Как уже упоминалось, & является небольшим сравнением, но также может служить сокращением «и». Например:

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

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

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

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

person AndrasK    schedule 09.02.2012