2013-09-12 3 views
3

Я довольно смущен этим выражением здесь. Я программист на Java, но я не очень хорошо разбираюсь в бит-манипуляциях.Смещение по отрицательным числам

Я думаю, что я понимаю, что ниже правильно:

Input : 1 << 10 
Output: 0000000000000000000010000000000 

Для положительных чисел, я думаю, что это вы двигаетесь 1 по 10 бит.

Путаница, когда у меня есть ниже:

int val = -10 (binary representation : 1111111111111111111111111110110) 
Input : 1 << val 
Output: 0000000010000000000000000000000 

Это было бы очень здорово, если бы кто-то может объяснить мне значение левого сдвига или правого сдвига по отрицательным числом.

ответ

7

<< (и другие операторы сдвига) принимает только 5 младших битов правого операнда для int и 6 для long, потому что это не имеет никакого смысла перекладывать int более чем 31

В вашем случае это 0b10110 = 22.

Поэтому 1 << (-10) эквивалентен 1 << 22.

+0

Большое спасибо ... Я думаю, что я получить его. – dharam

+1

Причина только для рассмотрения младших разрядов заключается в том, что аппаратное обеспечение делает это именно так. Было бы неэффективно делать это по-другому (скажем, сдвиг влево для положительного и правого для отрицательных чисел или возврат 0, если вы переместили 'int' на более чем 31). – starblue

4

От JLS, section 15.19:

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

Другими словами,

1 << -10 

эквивалентно:

1 << (-10 & 0x1f) 

... которая

1 << 22 
+0

большое спасибо :) – dharam

Смежные вопросы