Может кто-то объяснить, почему следующие битовые выражения не возвращать разные результаты:оператор побитового Java <<
System.out.println((-1<<31)<<1); // it prints 0
System.out.println(-1<<32); // it prints -1
Может кто-то объяснить, почему следующие битовые выражения не возвращать разные результаты:оператор побитового Java <<
System.out.println((-1<<31)<<1); // it prints 0
System.out.println(-1<<32); // it prints -1
-1<<32
эквивалентно -1<<0
, т.е. не-оп. Причина заключается в том, что изменение расстояния (32)
является И-эд с 0x1f
и 32 & 0x1f
0.
Это определяется в JLS #15.19 (курсив мой):
Если расширенный тип левого операнда is int, тогда только пять младших разрядов правого операнда используются как расстояние сдвига. Это как если бы правый операнд был подвергнут поразрядному логическому оператору И & (§15.22.1) с значением маски 0x1f (0b11111). Поэтому фактически используемое расстояние сдвига всегда находится в диапазоне от 0 до 31 включительно.
Значение счетчика сдвига используется по модулю 32. Таким образом, второй пример фактически такой же, как переход от 0.
Также http://stackoverflow.com/q/34193787/1743880 и HTTP: // stackoverflow.com/q/3170412/1743880 – Tunaki
@ Тунаки: Да, это похоже. – nenito