>>之间是否有任何区别和>>> 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
答案 0 :(得分:20)
>>
运算符保留符号(符号扩展),而>>>
将最左边的位(零扩展)归零。
-10>>2
res0: Int = -3
-10>>>2
res1: Int = 1073741821
对于像C这样具有签名和无符号类型的语言,这是不必要的,与Java不同,Java也有>>>
(因为它没有无符号整数)。
答案 1 :(得分:2)
注意:使用SLIP 30(2015年11月),Scala可能最终(2016年?2017年?)以4&#34;原始&#34;表示无符号整数的类型:List<Library> library = session
.createCriteria(Library.class)
.setFetchMode("books", FetchMode.JOIN)
.setFetchMode("videoShelves.videos", FetchMode.JOIN).
.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
.list();
,UByte
,UShort
和UInt
。
这会影响Bit shifting operations on UInts and ULongs,这也说明了ULong
和>>
之间的差异:
左移
>>>
并向右移动<<
以明显的方式行事。班次算术权
>>>
的情况值得商榷 我们认为它不应该在无符号整数上可用,原因有两个:
- 首先,移位算术权对无符号整数似乎没有任何意义。如果
>>
,则正确的算术移位。因此,与>>>
类似,不应该引入它。- 其次,具有无符号整数类型的现有语言(例如C系列)实际上为
unary_-
提供了不同的语义,具体取决于它是否具有有符号或无符号操作数:
无符号操作数上的>>
不进行符号扩展。对于>>
的C开发人员而言,在Scala中进行签名扩展会让人感到困惑,但对于x >> 3
未签署扩展的Scala开发人员来说同样令人困惑。因此,我们更愿意完全抛弃它,并引发编译器错误。如果一个基于bit-twiddling的算法需要右移符号,那么总是可以重新解释为signed,执行操作,并重新解释为unsigned:
x >> 3
。注意:当前的实现确实提供了
(x.toInt >> 3).toUInt
,直到我们同意这一点。
答案 2 :(得分:1)
它们与Java中的含义相同。
来自The Java™ Tutorials - Bitwise and Bit Shift Operators:
签名左移运算符“&lt;&lt;”将位模式向左移位,并使用带符号的右移运算符“&gt;&gt;”将位模式向右移动。位模式由左侧操作数给出,位置数由右侧操作数移位。无符号右移运算符“&gt;&gt;&gt;”将零移动到最左边的位置,而在“&gt;&gt;”之后的最左边的位置移动取决于符号扩展。