如何在Scala中编写二进制文字?

Lar*_*ann 23 binary scala

Scala直接支持使用十六进制和八进制数:

scala> 01267 + 0100
res1: Int = 759

scala> 0x12AF + 0x100
res2: Int = 5039
Run Code Online (Sandbox Code Playgroud)

但是你如何在Scala中将整数表示为二进制数?

Kim*_*bel 23

如果性能不是问题,您可以使用String并将其转换为整数.

val x = Integer.parseInt("01010101", 2)
Run Code Online (Sandbox Code Playgroud)

部分不支持二进制数,因为您可以轻松地将十六进制转换为二进制,反之亦然.为了使您的代码更清晰,您可以将二进制数放在注释中.

val x = 0x55 //01010101
Run Code Online (Sandbox Code Playgroud)

  • 哇,真糟糕。我不同意“您可以轻松地从十六进制转换为二进制,反之亦然”的理由。如果您想要的是使用二进制表示法,我认为您应该可以,尤其是因为 Java 支持它 =( (3认同)

Eug*_*ako 18

在2.10中你可以为它创建一个字符串插值器,例如它可以写入b"0010"均值2.使用宏可以消除相关的运行时开销,并在编译时进行转换.看看Jason Zaugg的宏观世界,看看它的实际效果:

scala> b"101010"
res4: Int = 42

scala> b"102"
<console>:11: error: exception during macro expansion: invalid binary literal
              b"102"
              ^
Run Code Online (Sandbox Code Playgroud)


Ami*_*ico 8

使用2.10中的新"隐式类"和"值类"机制,您可以编写类似这样的内容来添加便捷方法,而无需创建对象的开销:

implicit class IntToBase( val digits:String ) extends AnyVal {
  def base(b:Int) = Integer.parseInt( digits, b )
  def b = base(2)
  def o = base(8)
  def x = base(16)
}
Run Code Online (Sandbox Code Playgroud)

这可以让你做的事情

"555".o  // 365 decimal
Run Code Online (Sandbox Code Playgroud)

并且实际上并未创建任何IntToBase对象.


Lui*_*hys 6

如果你从@agilesteel建议的"看起来像二进制"的整数转换,你需要小心.例如0101.b,尝试将65十进制转换为二进制(初始0表示八进制),而101.b将尝试将101十进制转换为二进制.尝试从一个String转换Integer.parseInt,从一个数字转换为二进制String表示,它才真正有意义Integer.toString(x, 2).

我想不出程序化二进制文字的太多用例.也就是说,他们已经将Java 7作为带前缀的数字0b,所以如果他们很快没出现在Scala中,我会感到惊讶.不过,15年来Java似乎已经没有它们了.

  • 没有无符号字符或类似的按位运算符,Java已经做得很好."很好",我的意思是人们只是放弃编写Java中需要的东西,否则每一寸都会诅咒Java. (9认同)