【发布时间】: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 中的 >> 和 >>> 运算符有什么区别吗?
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 中的含义相同。
来自The Java™ Tutorials - Bitwise and Bit Shift Operators:
有符号左移运算符“>”将位模式右移。位模式由左侧操作数给出,要移位的位置数由右侧操作数给出。无符号右移运算符“>>>”将零移到最左边的位置,而“>>”之后的最左边的位置取决于符号扩展。
【讨论】:
>>> 仅存在于 Java 中。
注意:使用SLIP 30(2015 年 11 月),Scala 可能最终(在 2016 年?2017 年?)使用 4 种“原始”类型来表示无符号整数:UByte、UShort、UInt 和 @ 987654326@.
这会影响Bit shifting operations on UInts and ULongs,这也说明了>>和>>>之间的区别:
左移
<<和逻辑右移>>>的行为很明显。算术右移
>>的情况值得商榷。
我们认为它不应该在无符号整数上可用,原因有两个:
- 首先,算术右移似乎对无符号整数没有任何意义。如果
>>>正确算术移位。因此,与unary_-类似,不宜引入。- 第二,具有无符号整数类型的现有语言,例如 C 系列,实际上根据
>>是否具有带符号或无符号操作数,赋予其不同的语义:
无符号操作数上的>>不会进行符号扩展。x >> 3在 Scala 中进行符号扩展会让 C 开发人员感到困惑,但对于x >> 3不进行符号扩展的 Scala 开发人员来说,同样会感到困惑。因此,我们宁愿将其完全省略,并引发编译器错误。如果基于位旋转的算法需要符号扩展右移,则始终可以重新解释为有符号,执行操作,然后重新解释为无符号:
(x.toInt >> 3).toUInt。注意:当前的实现确实提供了
>>,直到我们在这一点上达成一致。
【讨论】: