>>之间的差异和>>>在斯卡拉

时间:2013-06-20 04:42:34

标签: scala operators bit-shift

>>之间是否有任何区别和>>> 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

3 个答案:

答案 0 :(得分:20)

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

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

Try it out yourself.

对于像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();UByteUShortUInt

这会影响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;”之后的最左边的位置移动取决于符号扩展。