具体来说,我想拿这个号码:
x = 1452610545672622396
并执行
x ^ =(x <&lt; 21)//在Python中我做x ^ =(x <&lt; 21)&amp; 0xffffffffffffffff
并获取:12043412836254060860 //这是我在Python中获得的
代替:-6403331237455490756 //这是我用Java得到的(并且不想要)
答案 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
}