2012-02-08 5 views
7

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

(7 & 8) == 0? 

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

7 == 0 || 8 == 0? 

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

ответ

17

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

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

3

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

4

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

7 ->0111

8 ->1000

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

Это wikipedia article объясняет это хорошо ваш пример и объяснение других побитых операторов.

10

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

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); 
3

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

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

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

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

только выдаст ошибку, если х равен 3. Если х не равен 3, Java не будет беспокоить оценки остальных выражений, потому что Ложные & ничего будет false.