检测Scala

时间:2016-02-05 14:28:26

标签: scala

我正在尝试找出一种最简单的方法来编写一个函数来检测Scala中数字所需的字节数。

例如数字

 0 should be 0 bytes
 1 should be 1 byte
 127 should be 1 byte
 128 should be 2 bytes
 32767 should be 2 bytes
 32768 should be 3 bytes
8388607 should be 3 bytes
8388608 should be 4 bytes
2147483647 should be 4 bytes
2147483648 should be 5 bytes
549755813887 should be 5 bytes
549755813888 should be 6 bytes
9223372036854775807 should be 8 bytes.
-1 should be 1 byte
-127 should be 1 bytes
-128 should be 2 bytes
-32767 should be 2 bytes
-32768 should be 3 bytes
-8388607 should be 3 bytes
-8388608 should be 4 bytes
-2147483647 should be 4 bytes
-2147483648 should be 5 bytes
-549755813887 should be 5 bytes
-549755813888 should be 6 bytes
-9223372036854775807 should be 8 bytes

有没有办法做这个,除了做数学计算数字是2 ^ N?

2 个答案:

答案 0 :(得分:1)

在评论中的所有精确度之后,我猜负数的算法将是:无论对应的答案是什么;并且Long.MinValue不是可接受的输入值。

因此,我建议:

def bytes(x: Long): Int = {
  val posx = x.abs
  if (posx == 0L) 0
  else (64 - java.lang.Long.numberOfLeadingZeros(posx)) / 8 + 1
}

需要测试。

答案 1 :(得分:0)

正如我所提到的,你基本上要求的是“比我的数字更大的2个数字的最小值”,并对符号的额外数字进行一些调整(正数或负数)。

这是我的解决方案,虽然0和-128的结果不同,因为,正如Bergi评论你的问题,你不能真正用0字节写0,而-128适合1字节。

import Math._

def bytes(x: Double): Int = {
  val y = if (x >= 0) x + 1 else -x
  ceil((log(y)/log(2) + 1)/8).toInt
}