Оператор сдвига Java - PullRequest
       55

Оператор сдвига Java

4 голосов
/ 09 февраля 2012

Рассмотрим следующий код Java:

byte a = -64; 
System.out.println(a << 1);

Вывод этого кода -128

Я попытался выяснить, почему это вывод:

64 = 0 1000000 (MSB является знаковым битом)

-64 = 1 1000000 (формат дополнения Tow)

Ожидаемый результат после сдвига: 1 0000000 (это равно 0,потому что MSB - это просто знаковый бит)

Пожалуйста, кто-нибудь объяснит, что мне не хватает.

Ответы [ 7 ]

3 голосов
/ 09 февраля 2012

Дополняющее представление двух -128 равно 10000000, поэтому ваши результаты верны.

2 голосов
/ 09 февраля 2012

Эта программа

System.out.println(Integer.toBinaryString(-64));
System.out.println(Integer.toBinaryString(-64 << 1));
System.out.println("-64 << 1 = " + (-64 << 1));

печатает

11111111111111111111111111000000
11111111111111111111111110000000
-64 << 1 = -128

Вы можете видеть, что -64 << 1 совпадает с -64 за исключением того, что все биты сдвинуты влево на 1младший бит становится 0) </p>

2 голосов
/ 09 февраля 2012
10000000 is -128
10000001 is -127
10000010 is -126
...

То есть 10000000 не 0. Это -128, который был вашим выводом.

1 голос
/ 09 февраля 2012

В дополнении к двум MSB - это не просто знаковый бит, ты думаешь, что их можно дополнить? В 8 бит два дополнения,

10000000 = 0x80 = -128

1 голос
/ 09 февраля 2012

В операторах сдвига знаковый бит игнорируется.Таким образом, 1 1000000 << 1 - это 10000000, что составляет -128. В чем проблема? <br>Наши машины используют дополнение к двум для представления чисел (со знаком и без знака).Для представления отрицательного числа машина отрицает его положительное значение и добавляет 1.
-128 равно! 10000000 + 1 = 01111111 + 1 = 10000000
РЕДАКТИРОВАТЬ:
Я был неправ, только правое смещениеоператор игнорирует знаковый бит.10100000 << 1 == 01000000 <br>Для беззнакового смещения вправо есть оператор >>>, который тоже сдвигает знаковый бит.
11000000 >> 1 == 10100000 и 11000000 >>> 1 == 01100000

0 голосов
/ 09 февраля 2012

Мне интересно.<< 1 (игнорируя все детали) равно «умножить на 2.» -64 * 2 = -128.Так почему же вам интересно, что это действительно -128?

0 голосов
/ 09 февраля 2012

<< означает умножить на 2

>> означает деление на 2

И, во время смены, не учитывайте бит со знаком.

...