почему 1 >> 32 == 1?

Мне интересно, может быть, это ошибка JVM?

java-версия «1.6.0_0» среда выполнения OpenJDK (IcedTea6 1.4.1) (6b14-1.4.1-0ubuntu13) 64-разрядная виртуальная машина OpenJDK (assembly 14.0-b08, смешанный режим)

class Tmp { public static void main(String[] args) { System.out.println("1>>1 = "+(1>>1)); System.out.println("1>>2 = "+(1>>2)); System.out.println("1>>31 = "+(1>>31)); System.out.println("1>>32 = "+(1>>32)); System.out.println("1>>33 = "+(1>>33)); } } 

производит это, когда я запускаю его:

 1>>1 = 0 1>>2 = 0 1>>31 = 0 1>>32 = 1 >33 = 0 

Я также получаю те же результаты для любого кратного 32.

мне нужно написать свой собственный правый сдвиг, чтобы проверить это?

http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.22.1

15.19 Операторы сдвига

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

Если продвинутый тип левого операнда длинный , то в качестве расстояния сдвига используются только шесть младших бит правого операнда . Это как если бы правый операнд подвергался поразрядному логическому оператору AND & (§15.22.1) с значением маски 0x3f . Поэтому фактически используемое расстояние сдвига всегда находится в диапазоне от 0 до 63 включительно.

(акцент мой)

Это не ошибка. В n >> m он смотрит только на последние пять бит m – поэтому любое число, большее 31, будет уменьшено до этого числа mod 32. Таким образом, (256 >> 37) == 8 истинно.

Edit: Это верно, если вы работаете с ints. Если это длинный, то он смотрит на последние шесть бит м или моды на 64.

  • Подписать CSR с помощью Bouncy Castle
  • Java - получить пиксельный массив из изображения
  • В Scala, как я могу подclassифицировать class Java с несколькими конструкторами?
  • Java EE 6 @ javax.annotation.ManagedBean vs. @ javax.inject.Named vs. @ javax.faces.ManagedBean
  • ConcurrentModificationException для ArrayList
  • Список всех специальных символов, которые должны быть экранированы в регулярном выражении
  • Отложенный ответ на событие выбора строки JTable при огромной загрузке данных
  • Главная Тема против UI Thread в Java
  • Воспроизведение MP3 с использованием Java Sound API
  • RabbitMQ и связь между каналом и соединением
  • Отправить письмо нескольким получателям в java
  • Давайте будем гением компьютера.