首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Scala中设置二进制值的格式

在Scala中设置二进制值的格式
EN

Stack Overflow用户
提问于 2012-02-25 16:00:23
回答 8查看 28.2K关注 0票数 35

Scala有内置的二进制数据格式化程序吗?

例如,打印out: 00000011作为Int值3。

写一个并不难--只是好奇它是否存在。

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2012-02-25 16:06:46

代码语言:javascript
复制
scala> 3.toBinaryString
res0: String = 11

Scala有一个从Int到RichInt的隐式转换,它有一个toBinaryString方法。但是,此函数不打印前导零。

票数 62
EN

Stack Overflow用户

发布于 2012-02-25 16:05:47

我不知道有什么直接的API方法可以做到这一点,但这里有一种方法:

代码语言:javascript
复制
def toBinary(i: Int, digits: Int = 8) =
    String.format("%" + digits + "s", i.toBinaryString).replace(' ', '0')
票数 22
EN

Stack Overflow用户

发布于 2012-02-26 00:22:45

带有前导零的数字3的8位数字:

代码语言:javascript
复制
printf ("%08d", 3.toBinaryString.toInt)
00000011

由于Hosam Aly还建议创建一个字符串,下面是一个这样做的方法:

代码语言:javascript
复制
def asNdigitBinary (source: Int, digits: Int): String = {
  val l: java.lang.Long = source.toBinaryString.toLong
  String.format ("%0" + digits + "d", l) }

在一般情况下,使用Long更合适,因为二进制值变长的速度非常快:

代码语言:javascript
复制
scala> asNdigitBinary (1024*512-1, 32)
res23: String = 00000000000001111111111111111111

所以请记住这一点--一种自制的递归方法可以很容易地处理BigInt的任意值,这种方法可以逐位生成,并在最后填充它们。

代码语言:javascript
复制
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
}

这将是很好的,如果

代码语言:javascript
复制
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呢?

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9442381

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档