Scala直接支持使用十六进制和八进制数字:
scala> 01267 + 0100
res1: Int = 759
scala> 0x12AF + 0x100
res2: Int = 5039
但是你如何在Scala中将整数表示为二进制数呢?
如果性能不是问题,你可以使用String类型并将其转换为整数。
val x = Integer.parseInt("01010101", 2)
之所以不直接支持二进制数,是因为你可以轻松地在十六进制和二进制之间进行转换。为了使你的代码更清晰,你可以将二进制数放在注释中。
val x = 0x55 //01010101
val x: Int = -2147483648
后面加上 val y: Int = Integer.parseInt(x.toBinaryString, 2)
会导致异常。请注意,x
仍然是一个有效的整数。 - yarchik在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"
^
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对象。
0101.b
会尝试将65十进制转换为二进制(初始0表示八进制),而101.b
则会尝试将101十进制转换为二进制。只有从字符串转换才真正有意义,对于这一点,可以使用Integer.parseInt
,以及从数字到二进制字符串表示,可以使用Integer.toString(x, 2)
。0b
的数字出现在Java 7中,因此如果它们不久后出现在Scala中,我会感到惊讶。然而,Java似乎在没有它们的情况下度过了15年。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
0101
是一个八进制数! - soc如果你想获得一个Int的二进制表示的字符串,可以调用4.toBinaryString
。填充更加困难。你需要像这样做:4.toBinaryString.reverse.padTo(8, "0").reverse.mkString
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位值