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

时间:2011-08-25 21:01:40

标签: scala binary

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

scala> 01267 + 0100
res1: Int = 759

scala> 0x12AF + 0x100
res2: Int = 5039

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

7 个答案:

答案 0 :(得分:23)

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

val x = Integer.parseInt("01010101", 2)

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

val x = 0x55 //01010101

答案 1 :(得分:18)

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

scala> b"101010"
res4: Int = 42

scala> b"102"
<console>:11: error: exception during macro expansion: invalid binary literal
              b"102"
              ^

答案 2 :(得分: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)
}

这可以让你做像

这样的事情
"555".o  // 365 decimal

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

答案 3 :(得分:6)

如果你从@agilesteel建议的“看起来像二进制”的整数转换,你需要小心。例如0101.b将尝试将65十进制转换为二进制(初始0表示八进制),而101.b将尝试将101十进制转换为二进制。尝试从具有Integer.parseInt的字符串和从数字转换为二进制字符串表示形式(仅存在Integer.toString(x, 2)}才真正有意义。

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

答案 4 :(得分:4)

如果您打算大量使用它,可以通过隐式转换来模拟行为。

object Extensions {
  implicit def conversion(x: Int) = new BinaryInt(x)
  class BinaryInt(x: Int) {
    def b = {
      // Conversion code like Integer.parseInt
      // as Kim suggested
    }
  }
}

现在你可以做像

这样的事情了
import Extensions._
val x = 0101.b
// or
val x = 5.b

你必须自己决定转换的方向。

答案 5 :(得分:1)

如果要获取Int的二进制表示形式的字符串,可以调用4.toBinaryString。填充更难。您必须执行以下操作:4.toBinaryString.reverse.padTo(8, "0").reverse.mkString

答案 6 :(得分:0)

def _0b(row: Int): Int = {
  row.toString
    .reverse
    .split("")
    .zipWithIndex
    .map(x => (x._1.toInt, x._2))
    .filter(_._1 == 1)
    .map(x => Math.pow(2,x._2).toInt)
    .sum
}

_0b(10011001) = 153

尽管仅限于32位值