2011-01-27 4 views
10

Можно создать дубликат:
why is 1>>32 == 1?Почему (-1 >>> 32) = -1?

-1 как INT преобразуется в двоичный представлена ​​32-х 1. Когда я сдвигаю его вправо 31 раз, я получаю 1 (31 0 и один 1). Но когда я вправо-сдвиг 32 раза, я снова получаю -1. Не должно ли оно быть равно 0?

+1

Похоже на Java. Я не знаю многих языков, определяющих оператор '>>>'. – leppie

+0

Я столкнулся с этим, пока я пытался изучить основы Java, да, но я не отмечал его, так как я предполагал, что смещение бит было довольно общей концепцией. – user183037

+1

check: http://stackoverflow.com/questions/3170412/why-is-132-1 –

ответ

17

Спецификация Java объясняет shift operators следующим образом:

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

Значение 32 & 0x1f равно нулю.

Если левый операнд long, то вы получите дополнительный бит правого операнда, расширяя верхний предел до 63 вместо 31.


Для того, чтобы иметь какое-либо конкретное ожидаемое значение от смещения - 1 вправо, вам нужно указать базовое двоичное представление целых чисел (например, дополнение двух), а также количество бит (например, 32). Каждый язык программирования может определять их по-разному, но в интересах упрощения реализации для них обычно указывается, что смещение больше, чем количество доступных битов не допускается. Это часто происходит из-за того, что базовое процессорное оборудование не поддерживает его. В конце концов, если вы хотите перенести это много бит, левый операнд больше не имеет значения, так как результат всегда будет одинаковым.

+0

Спасибо, это имеет смысл. – user183037

+1

BTW означает, что вы можете получить верхний бит 'x', используя' x >> 63' или 'x >> -1', является ли x int или long. ;) –

+0

Смещение может также зависеть от 32/64 бит системы. – TheCottonSilk