Java >> против >>> Оператор?

У меня нет моего справочника по Java, и мне сложно найти ответ с Google.

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

int value = 0x0100;

int result = (value >> 8);
System.out.println("(value >> 8) = " + result);  // Prints: "(value >> 8) = 1"

result = (value >>> 8);
System.out.println("(value >>> 8) = " + result); // Prints: "(value >>> 8) = 1"

Ответ 2

Подписанные целые числа используют старший бит для обозначения знака.

So >> сохраняет знак, а >>> - нет. Вот почему >> называется арифметическим сдвигом, а >>> является логическим сдвигом.

Таким образом, вы можете сделать (предполагая 32-битные целые числа) следующее:

  • -10 >> 1 дает -5 (0xFFFFFFF6 >> 1 дает 0xFFFFFFFB - обратите внимание, что бит старшего разряда остается тем же.)
  • -10 >>> 1 дает 2147483643 (0xFFFFFFF6 >>> 1 дает 0x7FFFFFFB - уведомление о том, что все биты были сдвинуты, поэтому бит старшего порядка теперь равен нулю. Число больше не отрицательно в соответствии с арифметикой twos-комплемента.)

Для положительных целых чисел >> и >>> действуют одинаково, так как бит высокого порядка уже равен нулю.

Это также объясняет, почему нет необходимости в операторе <<<. Поскольку знак будет разбит, сдвинув биты влево, он не будет отображаться без разумной арифметической операции.

Ответ 3

От Заметки Java: Побитовые операторы:

n → p (правый сдвиг) Сдвигает бит n правильных позиций p. Если n является номером с номером в 2 дополнения, знаковый бит сдвигается в позиции высокого порядка.

Пример: 5 → 2 = 1

n → > p (правый сдвиг) Сдвигает бит n правильных позиций p. Нули сдвинуты в позиции высокого порядка.

Пример: -4 → > 28 = 15

Ответ 4

Правильный ответ был отправлен несколько раз, но не из авторитетного источника.

Это из JLS §15.19 Операторы сдвига:

Операторы сдвига включают в себя сдвиг влево <<, сдвиг вправо >> и сдвиг вправо без знака >>>; они синтаксически лево-ассоциативные (они группируются слева направо). Левым операндом оператора сдвига является сдвинутое значение; правый операнд указывает расстояние сдвига.

...

Значение n>>s - это n смещенные вправо s битовые позиции с расширением знака. Результирующее значение равно: n/2 s & rfloor;. Для неотрицательных значений n это эквивалентно усечению целочисленного деления, которое вычисляется оператором целочисленного деления /, на два с мощностью s.

Значение n>>>s - это n смещенные вправо позиции s с нулевым расширением. Если n положительно, то результат будет таким же, как результат n>>s; если n отрицательно, результат равен выражению (n>>s)+(2<<~s), если тип левого операнда int и результат выражения (n>>s)+(2L<<~s), если тип левого символа - ручной операнд long. Добавленный термин (2<<~s) или (2L<<~s) отменяет распространенный знаковый бит. (Заметим, что из-за неявного маскирования правого операнда оператора сдвига ~s как расстояние сдвига эквивалентно 31-s при смещении значения int и 63-s при смещении a long значение.)

Ответ 5

Для положительных чисел разницы нет. Отрицательные (два дополнения) числа будут заполнены нулями для → > и единиц для → .

1010 0110 → > 2 = 0010 1001

1010 0110 → 2 = 1110 1001

Ответ 6

→ - это арифметический сдвиг, который сохраняет знаковый бит в любых "свободных" битах. Другой - логический сдвиг, который заполняет свободные пятна нулями.

Ответ 7

some информация

оператор → сохраняет самые левые биты. Самые левые биты заполняются предыдущим контентом. Это связано с расширением знака. В этом случае есть 1 слева, и он сохраняется. Если вы не хотите оставить 1 слева, используйте оператор → > , который сдвигает 0 в самые левые бит

Ответ 8

Он имеет отношение к значению математического значения. Таблетки >>> в нулях для битов верхнего порядка, >> сохраняет знаковый бит и втягивает его.

Ответ 9

Арифметический сдвиг → является делением на два для целых чисел со знаком, тогда как логический сдвиг → > является делением на два для неподписанных чисел (если вы интерпретируете шаблон бита в подписанном Java int как целое без знака).