【问题标题】:Difference between >> and >>> in ScalaScala中>>和>>>之间的区别
【发布时间】:2013-06-16 19:47:40
【问题描述】:

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

【问题讨论】:

    标签: scala operators bit-shift


    【解决方案1】:

    >> 运算符保留符号(符号扩展),而>>> 将最左边的位归零(零扩展)。

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

    Try it out yourself.

    这在像 C 这样有符号和无符号类型的语言中是不必要的,不像 Java,它也有 >>>(因为它没有无符号整数)。

    【讨论】:

    【解决方案2】:

    它们与 Java 中的含义相同。

    来自The Java™ Tutorials - Bitwise and Bit Shift Operators

    有符号左移运算符“>”将位模式右移。位模式由左侧操作数给出,要移位的位置数由右侧操作数给出。无符号右移运算符“>>>”将零移到最左边的位置,而“>>”之后的最左边的位置取决于符号扩展。

    【讨论】:

    【解决方案3】:

    注意:使用SLIP 30(2015 年 11 月),Scala 可能最终(在 2016 年?2017 年?)使用 4 种“原始”类型来表示无符号整数:UByteUShortUInt 和 @ 987654326@.

    这会影响Bit shifting operations on UInts and ULongs,这也说明了>>>>>之间的区别:

    左移<< 和逻辑右移>>> 的行为很明显。

    算术右移>> 的情况值得商榷。
    我们认为它不应该在无符号整数上可用,原因有两个:

    • 首先,算术右移似乎对无符号整数没有任何意义。如果>>> 正确算术移位。因此,与unary_-类似,不宜引入。
    • 第二,具有无符号整数类型的现有语言,例如 C 系列,实际上根据 >> 是否具有带符号或无符号操作数,赋予其不同的语义
      无符号操作数上的 >> 不会进行符号扩展。 x >> 3 在 Scala 中进行符号扩展会让 C 开发人员感到困惑,但对于 x >> 3 不进行符号扩展的 Scala 开发人员来说,同样会感到困惑。因此,我们宁愿将其完全省略,并引发编译器错误。

    如果基于位旋转的算法需要符号扩展右移,则始终可以重新解释为有符号,执行操作,然后重新解释为无符号:(x.toInt >> 3).toUInt

    注意:当前的实现确实提供了>>,直到我们在这一点上达成一致。

    【讨论】:

      猜你喜欢
      • 2011-12-07
      • 2021-02-19
      • 2019-04-25
      • 1970-01-01
      • 2010-12-17
      • 1970-01-01
      • 2021-10-27
      • 2010-12-04
      • 2011-07-05
      相关资源
      最近更新 更多