Czy jest jakaś różnica między operatorem >> i >>> w Scali?Różnica między >> i >>> w Scali
scala> 0x7f >>> 1
res10: Int = 63
scala> 0x7f >> 1
res11: Int = 63
scala> 0x7f >> 4
res12: Int = 7
scala> 0x7f >>> 4
res13: Int = 7
Czy jest jakaś różnica między operatorem >> i >>> w Scali?Różnica między >> i >>> w Scali
scala> 0x7f >>> 1
res10: Int = 63
scala> 0x7f >> 1
res11: Int = 63
scala> 0x7f >> 4
res12: Int = 7
scala> 0x7f >>> 4
res13: Int = 7
Operator >>
chroni znak (logowania wystaje), natomiast >>>
wyzerowanie lewostronne bity (zero wystaje).
-10>>2
res0: Int = -3
-10>>>2
res1: Int = 1073741821
Nie jest to konieczne w językach takich jak C, które zostały podpisane i niepodpisane typów, w przeciwieństwie do Javy, która również >>>
(bo nie ma liczb całkowitych).
Mają one takie samo znaczenie jak w Javie. Podpisany operator przesunięcia w lewo "< <" przesuwa wzór bitowy w lewo, a operator prawego znaku przesunięcia ">>" przesuwa wzór bitowy w prawo. Wzór bitowy jest podawany przez lewy operand, a liczba pozycji do przesunięcia przez prawy operand. Niepodpisany operator przesunięcia w prawo ">>>" przesuwa zero do najbardziej wysuniętej na lewo pozycji, natomiast pozycja lewa po ">" zależy od rozszerzenia znaku.
">>>" istnieje tylko w Javie. –
@ JonathonReinhart https://github.com/scala/scala/blob/master/src/library/scala/Int.scala#L73 – 4lex1v
... Przepraszam, chodzi mi o to, że istnieje w Javie, ale nie w C ani C++. –
Uwaga: z SLIP 30 (listopad 2015), Scala może skończyć się (w 2016 roku 2017?) Z 4 "prymitywnych" typów reprezentować liczby całkowite: UByte
, UShort
, UInt
i ULong
.
To wpłynęłoby Bit shifting operations on UInts and ULongs, który ilustruje również różnicę między >>
i >>>
:
Przesunięcie w lewo
<<
i przesunięcie bitowe RIGHT>>>
zachowywać się w sposób oczywisty.Przypadek arytmetyki przesunięcia w prawo
>>
jest dyskusyjny.
Uważamy, że nie powinno być dostępne na liczby całkowite bez znaku z dwóch powodów:
- Najpierw arytmetyczne przesunięcie w prawo wydaje się nie mieć żadnego znaczenia na liczby całkowite bez znaku. Prawidłowe przesunięcie arytmetyczne, jeśli
>>>
. Dlatego też, podobnie jak w przypadkuunary_-
, nie należy go wprowadzać.- drugie, istniejących języków, które mają niepodpisanych typów całkowitych, takich jak rodziny C, rzeczywiście dają różne semantykę do
>>
w zależności od tego, czy ma ona podpisana lub niepodpisane operand:
>>
na unsigned argumentu nie podpisze -poszerzać. Byłoby mylące dla programisty C dlax >> 3
, aby podpisywać rozszerzenia w Scali, ale byłoby to równie mylące dla programisty Scala, że x >> 3
nie podlega rozszerzeniu. Dlatego wolimy go całkowicie pominąć i pozwolić na podniesienie błędu kompilatora.Jeśli algorytm nieco skręcenie oparte wymaga przesunięcia w prawo znak rozciągające, to zawsze można zinterpretować jako podpisany zrobić operację i reinterpretacji powrotem jako unsigned:
(x.toInt >> 3).toUInt
.Uwaga: obecna implementacja zapewnia
>>
, dopóki nie uzgodnimy tego punktu.
dziękuję, to jest przykładem, że trzeba zrozumieć ^^ – Kokizzu
[Gdzie simplyscala is gone?] (Https://www.reddit.com/r/scala/comments/3didyu/where_is_simplyscala_gone/) –