在Java中获取与Java相同的左移值

时间:2016-08-09 22:06:31

标签: java bit-shift

具体来说,我想拿这个号码:

x = 1452610545672622396

并执行

x ^ =(x <&lt; 21)//在Python中我做x ^ =(x <&lt; 21)&amp; 0xffffffffffffffff

并获取:12043412836254060860 //这是我在Python中获得的

代替:-6403331237455490756 //这是我用Java得到的(并且不想要)

1 个答案:

答案 0 :(得分:3)

您可以将x存储为BigInteger并在其上调用shiftLeft,然后进行xor操作。

为什么:你需要61位代表1452610545672622396,而将它左移21会溢出一个长(64位)。

-

你不能将结果转换回long,因为它需要64位,你只能使用其中的63个+符号。 (log2 12043412836254060860 = 63.3848780807)

以下是示例代码:

public static void main(String[] args) {
    long x = 1452610545672622396L;

    BigInteger bigX = BigInteger.valueOf(x);
    bigX = bigX.shiftLeft(21).xor(bigX).and(new BigInteger("ffffffffffffffff", 16));

    System.out.println(bigX); // 12043412836254060860
    System.out.println(bigX.longValue()); // -6403331237455490756
}