bitwiseやBigInt
を使用しているときに次のような現象が発生することを理解しようとしています。目的は2つのLong
値を組み合わせて「128ビットBigInt」を得ることです。scala.math.BigIntビット演算を使用する場合の制限はありますか?
val uuid = java.util.UUID.fromString("6fcb514b-b878-4c9d-95b7-8dc3a7ce6fd8")
val msb = BigInt(uuid.getMostSignificantBits)
// => 8055621744141552797
val lsb = BigInt(uuid.getLeastSignificantBits)
// => -7658496769846775848
(あなたがそれを無視することができるようにUUID
は、再現可能な2つのLong
値を提供する以外の目的を果たすしません):
まずは、2つのLong
値を作成してみましょう。
考え方は、lsb
とビット単位またはを使用してマージする前に、左にmsb
ビットを64ビットシフトすることです。
val result = (msb << 64) | lsb
ただし、結果はlsb
になります。換言すれば、((msb << 64) | lsb) == lsb
はtrue
である。それ以外は、((msb << 64) & lsb) == (msb << 64)
もtrue
です。
なぜですか?
編集:
ビットシフトが動作するよう、msb << 64
の中間結果は、127個のバイナリ数字(おそらく先頭のゼロ)を有しています。
負の値の符号ビットが繰り越されています。それらの先頭のビットはすべて、ORをとったときにシフトされた値を消去します。 2つの正の 'Long'値で動作するはずです。 – jwvh
もちろん、ありがとう。何らかの理由で私は負の数の先頭の1は64ビットを超えません。 – fxlae