Реализация операции Shift в Java

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

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

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

3 ответа

Решение

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам