我想做什么,将当前时间戳插入到许多类型 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 来打包位。但至少在这种情况下,如果您使用第二种方法并且知道数字字符串的长度,则可以轻松提取值,则可以很好地完成工作。酷 :-)