2015-05-04 1 views
1
public class Operator { 

    public static void main(String[] args) { 
     byte a = 5; 
     int b = 10; 
     int c = a >> 2 + b >> 2; 
     System.out.print(c); //prints 0 
    } 
} 

, когда 5 сдвинутых вправо с 2 битами, равно 1 и 10 сдвинутым вправо с 2 битами, равно 2, добавив значения 3 справа? Почему он печатает 0, я не могу понять даже при отладке.Оператор с правой стороны сдвига в java

ответ

7

Эта таблица представлена ​​в JavaDocs поможет понять оператора предшествования в Java

additive + -  /\ High Precedence 
         || 
shift << >> >>>  || Lower Precedence 

Так что ваше выражение будет

a >> 2 + b >> 2; 
a >> 12 >> 2; // hence 0 
+0

Итак, 'int c = a >> (2 + b) >> 2;' становится '5 >> 12 >> 2'? то как это оценить? 5 сдвинуто с 12 бит, становится равным нулю? а затем нуль, сдвинутый на 2 бита, приведет к нулю. Это верно? – kittu

+0

@kittu Да, это правильно. –

+0

@ kittu-'Все двоичные операторы, кроме операторов присваивания, оцениваются слева направо; операторы присваивания оцениваются справа налево. «Итак, 5 >> 12 будет оценено, а затем их результат будет вычислен как (результат >> 2). –

2

Это все о operator precedence. Оператор сложения имеет больше приоритетов над операторами сдвига.

Ваше выражение так же, как:

int c = a >> (2 + b) >> 2; 
+0

Да, это правда, но приоритет оператора будет играть только после оценки операндов? – kittu

+0

@kittu Что вы подразумеваете под этим? Выражение '(2 + b)' будет оценено первым, а затем будут выполнены операции сдвига. –

+0

Итак 'int c = a >> (2 + b) >> 2;' становится '5 >> 12 >> 2'? то как это оценить? – kittu

1

ли это то, что вы хотите?

int c = ((a >> 2) + b) >> 2; 

Вы переключали направо на 2 + b. Я предполагаю, что вы хотели сдвинуть 5 на 2 позиции, не так ли?

b000101 >> 2 == b0001øø 
    | |___________________|_| 
    |      | 
    |_____________________| 

т.е. крайний левый бит сдвигается вправо на 2 позиции и самый правый бит делает также (но не имеет не более действительные позиции слева на правую сторону, так что просто исчезает), а число становится то, что осталось - в этом случае «1». Если вы сдвинете число 5 на 12 позиций, вы получите нулевое значение, так как 5 имеет менее 12 позиций в двоичной форме. В случае «5» вы можете сместить не более двух позиций, если хотите сохранить ненулевое значение.

 Смежные вопросы

  • Нет связанных вопросов^_^