Scala:使用位移将Long插入BigInt

时间:2016-06-08 15:03:12

标签: scala bit-manipulation bit-shift

我想要将当前时间戳插入多个类型BigInt中。 BigInt中的所有内容都应该向左移动,以便为时间戳腾出空间。但是,应忽略时间戳的前导零。

我现在正在做的事情:

val number: BigInt = ...
val time = System.currentTimeMillis
val usedBits = 64 - java.lang.Long.numberOfLeadingZeros(time )
val newNumber = (number << usedBits) | t

有更好的方法吗?特别是第三行看起来并不是很优雅。

1 个答案:

答案 0 :(得分:0)

我不确定我是否遵循了什么/为什么你要使用BigInt进行转换,但你可以使用字符串来定义BigInts,这可能会让你更接近你想要的。

例如你有:

val number:BigInt = 999   // guessed a number
val time = System.currentTimeMillis   // results in Long = 1465400383430
val usedBits = 64 - java.lang.Long.numberOfLeadingZeros(time)  // results in Int = 41
val newNumber = (number << usedBits) | time  // results in BigInt = 2198289632679878

您可以改为将最后一行更改为:

val newNumber2 = BigInt( number.toString + time.toString )  // BigInt = 9991465400383430

深入研究差异(它只有3位):

newNumber.bitLength = 51
newNumber2.bitLength = 54

和二进制文件

newNumber.toLong.toBinaryString = " 111110011110101010100110000101010110101011111000110"
newNumber2.toLong.toBinaryString = "100011011111110010111101010001111110011011011111000110"

直到今天,我还没有考虑过使用BigInt打包。但至少在这种情况下,它可以很好地完成工作,如果您使用第二种方法作为奖励,并且如果您知道数字字符串的长度,则可以轻松提取值。酷: - )