Почему 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.