2013-06-20 4 views

ответ

16

>> оператор сохраняет знак (знак-расширяет), в то время как >>> обнуляет крайние левые биты (нулевой распространяется).

-10>>2 
res0: Int = -3 
-10>>>2 
res1: Int = 1073741821 

Try it out yourself.

Это не является необходимым в таких языках, как C, подписавшей и беззнаковых типов, в отличие от Java, который также имеет >>> (потому что он не имеет целых чисел без знака).

+0

спасибо, это пример того, что я должен понять ^^ – Kokizzu

+0

[Где simplyscala ушел?] (Https://www.reddit.com/r/scala/comments/3didyu/where_is_simplyscala_gone/) –

1

Они имеют то же значение, что и в Java. Подписанный оператор сдвига влево «< <» сдвигает бит влево, а сдвинутый сдвиговый оператор «>>» сдвигает бит вправо. Битовая диаграмма задается левым операндом, а количество позиций сдвигается правым операндом. Беззнаковый оператор сдвига вправо «>>>» сдвигает ноль в крайнее левое положение, а крайняя левая позиция после «>>» зависит от расширения знака.

+1

'>>>' существует только в Java. –

+0

@JonathonReinhart https://github.com/scala/scala/blob/master/src/library/scala/Int.scala#L73 – 4lex1v

+0

... извините, я имел в виду, что он существует в Java, но не C или C++. –

2

Примечание: с SLIP 30 (ноябрь 2015 г.), Scala может в конечном итоге (в 2016 году 2017?) С 4-мя "примитивных" типов для представления целых чисел без знака: UByte, UShort, UInt и ULong.

Это окажет влияние Bit shifting operations on UInts and ULongs, который также иллюстрирует разницу между >> и >>>:

Сдвиг влево << и Логический сдвиг вправо >>> ведут себя очевидным образом.

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

  • Во-первых, смещение арифметика право не представляется, имеют какое-либо значение на целых чисел без знака. Правильный арифметический сдвиг, если >>>. Следовательно, аналогично unary_-, его не следует вводить.
  • Во-вторых, существующие языки, которые делают беззнаковых целых типов, таких как семья C, на самом деле дают разные семантику >> в зависимости от того, имеет знаковое или беззнаковое операнд:
    >> на беззнаковое операнд не подписывает -extend. Было бы путать с разработчиком C для x >> 3 с расширением подписи в Scala, но разработчику Scala было бы так же путано, что x >> 3 не будет расшифровываться. Поэтому мы предпочитаем полностью исключить его, и пусть возникает ошибка компилятора.

Если алгоритм бит вертел на основе потребностей знаковый удлинителей сдвиг вправо, то всегда можно переосмысливать как знаковые, сделать операцию, и переосмысливать назад как беззнаковое: (x.toInt >> 3).toUInt.

Примечание: текущая реализация предоставляет >>, пока мы не договоримся об этом.

Смежные вопросы