scala.math.BigInt使用按位运算时的限制?

时间:2016-07-27 19:27:46

标签: scala bit-manipulation bitwise-operators biginteger bit-shift

我尝试了解在BigInt上使用按位和/或时出现的以下行为。目标是将两个Long值组合起来得到一个" 128位BigInt"。

首先,让我们创建两个Long值:

val uuid = java.util.UUID.fromString("6fcb514b-b878-4c9d-95b7-8dc3a7ce6fd8")
val msb = BigInt(uuid.getMostSignificantBits)
// => 8055621744141552797
val lsb = BigInt(uuid.getLeastSignificantBits)
// => -7658496769846775848

UUID除了提供可以复制的两个Long值之外没有任何其他用途,因此您可以忽略它。)

我们的想法是在使用bitwise或者将msblsb合并之前将val result = (msb << 64) | lsb 位移位。

lsb

但是,结果等于((msb << 64) | lsb) == lsb本身。换句话说,true((msb << 64) & lsb) == (msb << 64)。除此之外,true也是msb << 64

为什么?

编辑:

位移似乎有效,{{1}}的中间结果有127个二进制数字(可能是前导零)。

1 个答案:

答案 0 :(得分:1)

这是一种可以让你了解自己的方法。

import java.nio.ByteBuffer

val uuid = java.util.UUID.fromString("6fcb514b-b878-4c9d-95b7-8dc3a7ce6fd8")

val bb = ByteBuffer.allocate(16)
bb.putLong(uuid.getMostSignificantBits)
bb.putLong(uuid.getLeastSignificantBits)

val result: BigInt = bb.array.foldLeft(BigInt(0))((bi,b) => (bi << 8)|(0xFF & b))
// result = 148599992668788990968304946804723445720

// proof it works
println(f"$result%x")  // 6fcb514bb8784c9d95b78dc3a7ce6fd8