Scala直接支持使用十六进制和八进制数字:
scala> 01267 + 0100
res1: Int = 759
scala> 0x12AF + 0x100
res2: Int = 5039
但是如何在Scala中将整数表示为二进制数?
答案 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位值