【问题标题】:Scala bit Short斯卡拉位短
【发布时间】:2021-06-09 23:56:21
【问题描述】:

在我的控制台中,当我尝试检查 (0xFFFF.toShort).toBinaryString 时,它会返回

(0xFFFF.toShort).toBinaryString
res1: String = 11111111111111111111111111111111

不应该返回 1111111111111111,就像 16 1s 一样吗? (16位)

我该如何解决这个问题?

谢谢

【问题讨论】:

    标签: scala bit-manipulation bit short


    【解决方案1】:

    错误是https://github.com/scala/bug/issues/10216 扩展方法只为 int 定义。

    解决方法是自己为它们提供字节和短,如此处所示https://github.com/scala/scala/pull/8383/files

    例如

    scala> implicit class MyRichByte(val b: Byte) extends AnyVal {
         | def toBinaryString: String = java.lang.Integer.toBinaryString(java.lang.Byte.toUnsignedInt(b))
         | }
    class MyRichByte
    
    scala> (0xFFFF.toByte).toBinaryString
    val res4: String = 11111111
    

    在 REPL 中,使用// print 后跟制表符(用于制表符补全)查看

    scala> (0xFFFF.toShort).toBinaryString  //print
    scala.Predef.intWrapper(65535.toShort.toInt).toBinaryString // : String
    

    【讨论】:

      【解决方案2】:

      使用菊石desugar

      @ desugar((0xFFFF.toShort).toBinaryString)
      res5: Desugared = scala.Predef.intWrapper(65535.toShort.toInt).toBinaryString
      

      toBinaryString 是 Int 的一种方法,并且存在从 Short 到 Int (intWrapper) 的隐式转换。 toShort 被转换为 -1,而 -1 又被转换为 Int -1,这就是我们得到“1”的 32 的方式。

      【讨论】:

        猜你喜欢
        • 2013-11-23
        • 2011-09-16
        • 2016-01-31
        • 2017-10-23
        • 1970-01-01
        • 2017-01-19
        • 2021-11-06
        • 2011-12-29
        • 2017-06-19
        相关资源
        最近更新 更多