Вопрос-ответ

Difference between >>> and >>

Разница между >>> и >>>

В чем разница между >>> и >> операторами в Java?

Переведено автоматически
Ответ 1

>> это арифметический сдвиг вправо, >>> это логический сдвиг вправо.

При арифметическом сдвиге знаковый бит расширяется, чтобы сохранить знаковость числа.

Например: -2, представленное в 8 битах, будет 11111110 (потому что старший бит имеет отрицательный вес). Смещение его вправо на один бит с помощью арифметического сдвига даст вам 11111111, или -1. Логический сдвиг вправо, однако, не заботится о том, что значение может представлять число со знаком; он просто перемещает все вправо и заполняет слева 0s. Смещение нашего значения -2 вправо на один бит с помощью логического сдвига дало бы 01111111.

Ответ 2

>>> беззнаковый сдвиг; он вставит 0. >> имеет знак и расширит знаковый бит.

JLS 15.19 Операторы сдвига


Операторы сдвига включают сдвиг влево <<, сдвиг вправо со знаком >> и сдвиг вправо без знака без знака >>>.


Значение n>>s - это n сдвинутые s вправо битовые позиции с расширением знака.


Значение n>>>s - это n сдвинутые s вправо битовые позиции с нулевым расширением.


    System.out.println(Integer.toBinaryString(-1));
// prints "11111111111111111111111111111111"
System.out.println(Integer.toBinaryString(-1 >> 16));
// prints "11111111111111111111111111111111"
System.out.println(Integer.toBinaryString(-1 >>> 16));
// prints "1111111111111111"

Чтобы сделать вещи более понятными, добавляем положительный аналог

System.out.println(Integer.toBinaryString(121));
// prints "1111001"
System.out.println(Integer.toBinaryString(121 >> 1));
// prints "111100"
System.out.println(Integer.toBinaryString(121 >>> 1));
// prints "111100"

Поскольку он положительный, сдвиги как со знаком, так и без знака добавят 0 к самому левому биту.

Вопросы по теме

Ответ 3

>>> всегда будет ставить 0 в крайнем левом бите, в то время как >> будет ставить 1 или 0 в зависимости от того, какой у него знак.

Ответ 4

Они оба со сдвигом вправо, но >>> является unsigned

Из документации:


Оператор сдвига вправо без знака ">>>" сдвигает ноль в крайнюю левую позицию, в то время как крайняя левая позиция после ">>" зависит от расширения знака.


2023-05-17 00:15 java