簡體   English   中英

Scala中>>和>>>之間的區別

[英]Difference between >> and >>> in 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™教程 - 按位和位移操作符

帶符號的左移運算符“<<”將位模式向左移位,帶符號的右移運算符“>>”將位模式向右移位。 位模式由左側操作數給出,位置數由右側操作數移位。 無符號右移運算符“>>>”將零移動到最左側位置,而“>>”之后的最左側位置取決於符號擴展。

注意:使用SLIP 30 (2015年11月),Scala可能最終(2016年?2017年?)有4個“原始”類型來表示無符號整數: UByteUShortUIntULong

這會影響UI和ULongs上的位移操作 ,這也說明了>>>>>之間的區別:

左移<<和換檔邏輯右>>>在明顯的方式表現。

移位算術權>>情況值得商榷。
我們認為它不應該在無符號整數上可用,原因有兩個:

  • 首先,移位算術權對無符號整數似乎沒有任何意義。 正確的算術移位如果>>> 因此,與unary_-類似,不應該引入它。
  • 其次, 具有無符號整數類型的現有語言(例如C族)實際上給>>提供了不同的語義,具體取決於它是否具有有符號或無符號操作數
    無符號操作數上的>>不符號擴展。 對於一個C開發人員來說,在scala中使用x >> 3進行簽名擴展會讓人感到困惑,但對於sc x >> 3開發人員而言, x >> 3不能簽名擴展同樣令人困惑。 因此,我們更願意完全拋棄它,並引發編譯器錯誤。

如果一個基於bit-twiddling的算法需要符號擴展右移,則始終可以重新解釋為signed,執行操作,並重新解釋為unsigned: (x.toInt >> 3).toUInt

注意:當前的實現確實提供了>> ,直到我們就這一點達成一致。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM