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

Мне интересно, возможно ли это ошибка JVM?

java version "1.6.0_0" Рабочая среда OpenJDK (IcedTea6 1.4.1) (6b14-1.4.1-0ubuntu13) 64-разрядная серверная версия OpenJDK (сборка 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 <---------- should be 0 i think
1>>33 = 0

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

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

Ответ 1

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

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

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

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

(акцент мой)

Ответ 2

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

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