Scala有内置的二进制数据格式化程序吗?
例如,打印out: 00000011作为Int值3。
写一个并不难--只是好奇它是否存在。
发布于 2012-02-25 16:06:46
scala> 3.toBinaryString
res0: String = 11Scala有一个从Int到RichInt的隐式转换,它有一个toBinaryString方法。但是,此函数不打印前导零。
发布于 2012-02-25 16:05:47
我不知道有什么直接的API方法可以做到这一点,但这里有一种方法:
def toBinary(i: Int, digits: Int = 8) =
String.format("%" + digits + "s", i.toBinaryString).replace(' ', '0')发布于 2012-02-26 00:22:45
带有前导零的数字3的8位数字:
printf ("%08d", 3.toBinaryString.toInt)
00000011由于Hosam Aly还建议创建一个字符串,下面是一个这样做的方法:
def asNdigitBinary (source: Int, digits: Int): String = {
val l: java.lang.Long = source.toBinaryString.toLong
String.format ("%0" + digits + "d", l) }在一般情况下,使用Long更合适,因为二进制值变长的速度非常快:
scala> asNdigitBinary (1024*512-1, 32)
res23: String = 00000000000001111111111111111111所以请记住这一点--一种自制的递归方法可以很容易地处理BigInt的任意值,这种方法可以逐位生成,并在最后填充它们。
def toBinDigits (bi: BigInt): String = {
if (bi == 0) "0" else toBinDigits (bi /2) + (bi % 2)}
def fillBinary (bi: BigInt, len: Int) = {
val s = toBinDigits (bi)
if (s.length >= len) s
else (List.fill (len-s.length) ("0")).mkString ("") + s
}这将是很好的,如果
def asNdigitBinary (source: Int, digits: Int): String = {
val l = BigInt (source.toBinaryString.toLong)
String.format ("%0" + digits + "d", l)}将起作用,但"%0Nd“与BigInt数字不匹配。也许应该提出Bugreport/Feature请求?但是对于Scala或Java呢?
https://stackoverflow.com/questions/9442381
复制相似问题