Реализация операции Shift в Java - PullRequest
2 голосов
/ 15 марта 2012

Я недавно использовал операторы сдвига в Java и заметил, что оператор >> не имеет того же значения, что и >> в C. В Java >> - это сдвиг со знаком, в котором первый бит имеет то же значение. В Java эквивалентом C shift является оператор >>>. Оператор сдвига влево (<<) такой же, как в C, и просто сдвигает, игнорируя первый бит.

Интересно, что я

  • Зачем делать это изменение?
  • Почему нотация не согласована, поэтому >> и << означают сдвиг со знаком, а >>> и <<< без знака? </li>
  • Есть ли польза от подписанного оператора смены?

Ответы [ 3 ]

2 голосов
/ 15 марта 2012

Нет необходимости в левом сдвиге с учетом знака, поскольку представление дополнения 2: s сохраняет знак в старшем значащем бите.

Нет разницы между значением, сдвинутым на один бит влево каким-то «знаковым» образом, нет ничего, что вы можете сделать по-другому. Сдвиньте биты влево, вставьте 0 в младший значащий бит, и все готово.

Для чисел со знаком смещение вправо равно , а не , поэтому все четко, поэтому есть два оператора.

2 голосов
/ 15 марта 2012

Насколько я знаю, значения >> и >>> всегда были одинаковыми в Java.

Зачем делать это изменение?

Машинанезависимость.Значение >> в некоторой степени зависит от реализации в C.

1 голос
/ 15 марта 2012

Сдвиг со знаком слева и без знака слева абсолютно эквивалентны, поэтому нет необходимости иметь отдельный оператор.

С другой стороны, в Java нет типов без знака, поэтому он не может зависеть от типачтобы выяснить, какой сдвиг использовать.

Для справки, я думаю, что он у вас задом наперед - >> - смещение вправо со знаком, >>> - смещение вправо без знака.

...