我正在尝试找出一种最简单的方法来编写一个函数来检测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?
答案 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
}