Реализация операции Shift в Java
Я недавно использовал операторы сдвига в Java и заметил, что >>
оператор не имеет того же значения, что и оператор >>
в C. В Java >>
Сдвиг со знаком, который сохраняет первый бит на том же значении. В Java эквивалентом C shift является >>>
оператор. Оператор левого смещения (<<
) такой же, как в C, и просто сдвигается, игнорируя первый бит.
Интересно, что я
- Зачем делать это изменение?
- Почему нотация не согласована, поэтому >> и << означают сдвиг со знаком, а >>> и <<< - без знака?
- Есть ли польза от подписанного оператора смены?
3 ответа
Нет необходимости в левом сдвиге с учетом знака, поскольку представление дополнения 2:s сохраняет знак в старшем значащем бите.
Нет никакой разницы между значением, сдвинутым на один бит влево каким-то "знаковым" образом, нет ничего, что вы можете сделать по-другому. Сдвиньте биты влево, вставьте 0 в младший бит, и все готово.
При использовании чисел со знаком смещение вправо не так однозначно, поэтому есть два оператора.
Насколько я знаю значение >>
а также >>>
всегда было то же самое в Java.
Зачем делать это изменение?
Машинная независимость. Значение >>
в некоторой степени зависит от реализации в C.
Сдвиг со знаком слева и без знака слева абсолютно эквивалентны, поэтому нет необходимости иметь отдельный оператор.
С другой стороны, в Java нет беззнаковых типов, поэтому она не может зависеть от типа, чтобы выяснить, какой сдвиг использовать.
Для справки, я думаю, у вас есть это в обратном направлении - >>
подписан сдвиг вправо, >>>
беззнаковое смещение вправо.