繁体   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