Есть ли разница между >> и >>> оператором в Scala?Разница между >> и >>> в Scala
scala> 0x7f >>> 1
res10: Int = 63
scala> 0x7f >> 1
res11: Int = 63
scala> 0x7f >> 4
res12: Int = 7
scala> 0x7f >>> 4
res13: Int = 7
Есть ли разница между >> и >>> оператором в Scala?Разница между >> и >>> в Scala
scala> 0x7f >>> 1
res10: Int = 63
scala> 0x7f >> 1
res11: Int = 63
scala> 0x7f >> 4
res12: Int = 7
scala> 0x7f >>> 4
res13: Int = 7
>>
оператор сохраняет знак (знак-расширяет), в то время как >>>
обнуляет крайние левые биты (нулевой распространяется).
-10>>2
res0: Int = -3
-10>>>2
res1: Int = 1073741821
Это не является необходимым в таких языках, как C, подписавшей и беззнаковых типов, в отличие от Java, который также имеет >>>
(потому что он не имеет целых чисел без знака).
Они имеют то же значение, что и в Java. Подписанный оператор сдвига влево «< <» сдвигает бит влево, а сдвинутый сдвиговый оператор «>>» сдвигает бит вправо. Битовая диаграмма задается левым операндом, а количество позиций сдвигается правым операндом. Беззнаковый оператор сдвига вправо «>>>» сдвигает ноль в крайнее левое положение, а крайняя левая позиция после «>>» зависит от расширения знака.
'>>>' существует только в Java. –
@JonathonReinhart https://github.com/scala/scala/blob/master/src/library/scala/Int.scala#L73 – 4lex1v
... извините, я имел в виду, что он существует в Java, но не C или C++. –
Примечание: с 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
.Примечание: текущая реализация предоставляет
>>
, пока мы не договоримся об этом.
спасибо, это пример того, что я должен понять ^^ – Kokizzu
[Где simplyscala ушел?] (Https://www.reddit.com/r/scala/comments/3didyu/where_is_simplyscala_gone/) –