почему 1 >> 32 == 1? - PullRequest
       24

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

29 голосов
/ 03 июля 2010

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

Java-версия "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.

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

Ответы [ 2 ]

31 голосов
/ 03 июля 2010

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 включительно.

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

(акцент мой)

17 голосов
/ 03 июля 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...