Спецификация Java объясняет shift operators следующим образом:
Если расширенный тип левого операнда int
, пять битов низшего порядка для правого операнда используются только в качестве сдвига расстояние. Это как если бы правый операнд подвергался побитовому логическому оператору И &
(§15.22.1) с значением маски 0x1f
. Поэтому фактически используемое расстояние сдвига всегда находится в диапазоне от 0 до 31 включительно.
Значение 32 & 0x1f
равно нулю.
Если левый операнд long
, то вы получите дополнительный бит правого операнда, расширяя верхний предел до 63 вместо 31.
Для того, чтобы иметь какое-либо конкретное ожидаемое значение от смещения - 1 вправо, вам нужно указать базовое двоичное представление целых чисел (например, дополнение двух), а также количество бит (например, 32). Каждый язык программирования может определять их по-разному, но в интересах упрощения реализации для них обычно указывается, что смещение больше, чем количество доступных битов не допускается. Это часто происходит из-за того, что базовое процессорное оборудование не поддерживает его. В конце концов, если вы хотите перенести это много бит, левый операнд больше не имеет значения, так как результат всегда будет одинаковым.
Похоже на Java. Я не знаю многих языков, определяющих оператор '>>>'. – leppie
Я столкнулся с этим, пока я пытался изучить основы Java, да, но я не отмечал его, так как я предполагал, что смещение бит было довольно общей концепцией. – user183037
check: http://stackoverflow.com/questions/3170412/why-is-132-1 –