Scala:使用位移位将Long插入BigInt



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

我现在在做什么:

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

有没有更好的方法可以做到这一点?尤其是第三条线,似乎不是很优雅。

我不确定我是否遵循了您使用 BigInt 进行转变的内容/原因,但您可以使用字符串来定义 BigInt,这可能会让您更接近您想要的。

例如,您有:

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 来打包位。但至少在这种情况下,如果您使用第二种方法并且知道数字字符串的长度,则可以轻松提取值,则可以很好地完成工作。酷 :-)

相关内容

最新更新