[英]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中的含義相同。
帶符號的左移運算符“<<”將位模式向左移位,帶符號的右移運算符“>>”將位模式向右移位。 位模式由左側操作數給出,位置數由右側操作數移位。 無符號右移運算符“>>>”將零移動到最左側位置,而“>>”之后的最左側位置取決於符號擴展。
注意:使用SLIP 30 (2015年11月),Scala可能最終(2016年?2017年?)有4個“原始”類型來表示無符號整數: UByte
, UShort
, UInt
和ULong
。
這會影響UI和ULongs上的位移操作 ,這也說明了>>
和>>>
之間的區別:
左移
<<
和換檔邏輯右>>>
在明顯的方式表現。移位算術權
>>
情況值得商榷。
我們認為它不應該在無符號整數上可用,原因有兩個:
- 首先,移位算術權對無符號整數似乎沒有任何意義。 正確的算術移位如果
>>>
。 因此,與unary_-
類似,不應該引入它。- 其次, 具有無符號整數類型的現有語言(例如C族)實際上給
>>
提供了不同的語義,具體取決於它是否具有有符號或無符號操作數 :
無符號操作數上的>>
不符號擴展。 對於一個C開發人員來說,在scala中使用x >> 3
進行簽名擴展會讓人感到困惑,但對於scx >> 3
開發人員而言,x >> 3
不能簽名擴展同樣令人困惑。 因此,我們更願意完全拋棄它,並引發編譯器錯誤。如果一個基於bit-twiddling的算法需要符號擴展右移,則始終可以重新解釋為signed,執行操作,並重新解釋為unsigned:
(x.toInt >> 3).toUInt
。注意:當前的實現確實提供了
>>
,直到我們就這一點達成一致。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.