2013-06-20 18 views
8

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 

Odpowiedz

16

Operator >> chroni znak (logowania wystaje), natomiast >>> wyzerowanie lewostronne bity (zero wystaje).

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

Try it out yourself.

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).

+0

dziękuję, to jest przykładem, że trzeba zrozumieć ^^ – Kokizzu

+0

[Gdzie simplyscala is gone?] (Https://www.reddit.com/r/scala/comments/3didyu/where_is_simplyscala_gone/) –

1

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.

+1

">>>" istnieje tylko w Javie. –

+0

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

+0

... Przepraszam, chodzi mi o to, że istnieje w Javie, ale nie w C ani C++. –

2

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 przypadku unary_-, 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 dla x >> 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.

Powiązane problemy