2014-11-06 3 views
3

Я столкнулся с странной ситуацией при использовании оператора смены в java. Когда я сдвигаю с правой стороны на 16 на 31, это приводит к 0, но при попытке сдвига вправо 16 на 32 он остается 16. Не мог бы кто-нибудь объяснить это, потому что я схожу с ума.Почему в Java смещение вправо 16 на 32 приводит к 16, а не к 0? 16 >> 32 = 16 Почему?

public class RightShiftTest { 

    public static void main(String args[]) {   
     int b = 16; 
     System.out.println("Bit pattern for int " + b + " is " +Integer.toBinaryString(b)); 

     // As expected it is 0 
     System.out.println("After right-shifting " + b + " for 31 times the value is " + (b>>31) + " and bit pattern is " +Integer.toBinaryString(b>>31)); 

     // But why is it not 0 but 16 
     System.out.println("After right-shifting " + b + " for 32 times the value is " + (b>>32) + " and bit pattern is " +Integer.toBinaryString(b>>32)); 
    }  
} 

Output: 
Bit pattern for int 16 is 10000 
After right-shifting 16 for 31 times the value is 0 and bit pattern is 0 
After right-shifting 16 for 32 times the value is 16 and bit pattern is 10000 
+1

простой поиск в Google может дать вам ответ. – Vladp

+1

Q: «Почему язык X делает так, как он делает?» A: Потому что спецификация говорит так. – Durandal

+0

Ну, здравый смысл пришел именно так, поэтому я не думаю о проверке спецификации, в которой говорилось: (16 >> 1) 32 раза получал бы тот же результат, что и (16 >> 32) один раз. – abhishek08aug

ответ

9

В Java Language Specification состояния

Если расширенный тип левого операнда int, только пять битов низшего порядка из правой операнда используются в качестве сдвига расстояние. Это как если бы правый операнд был подвергнут поразрядному логическому оператору И & (§15.22.1) с положением « » с значением маски 0x1f (0b11111). Таким образом, фактически используемое расстояние сдвига всегда находится в диапазоне от 0 до 31 включительно.

Значение 32 представлено в виде

100000 

младшие 5 бит 00000 так 0, сдвинуты на 0 битов.

+0

Отличный ответ! Огромное спасибо. – abhishek08aug

+0

Если на ваш вопрос был дан ответ, пожалуйста, [отметьте ответ, который, по вашему мнению, наилучшим образом ответил на ваш вопрос как принятый] (http://stackoverflow.com/help/someone-answers), вместо того, чтобы оставлять комментарий, поблагодарив ответчика. После того, как у вас будет хотя бы 15 человек, вы также можете [повышать] (http://stackoverflow.com/help/why-vote) принятый ответ и любые другие ответы, которые вы нашли полезными. –

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