2016-08-09 8 views
1

В частности, я хочу взять этот номер:Получить же значение левого сдвига в Java, как Python

х = 1452610545672622396

и выполнять

х = (х < < 21) // В Python я х = (х < < 21) & 0xFFFFFFFFFFFFFFFF

и получить: 12043412836254060860, // что и я получаю в Python

вместо: -6403331237455490756 // Что и я получаю в Java (и не хочу)

+1

Какой тип вы используете для хранения этого числа в Java, что 'x'? – user1803551

+0

Извините, это длинный – cogmission

ответ

3

Вы можете хранить х как BigInteger и вызвать shiftLeft на него, а затем сделать вашу операцию XOR.

Зачем нужны 61 бит для представления 1452610545672622396, а смещение влево 21 переполняет длинный (64 бит).

-

Вы не можете преобразовать результат обратно в длинный, потому что нужно 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 
} 
+0

Вы попробовали? Вы получили тот же результат, что и ожидал OP? – user1803551

+1

[Это работает] (http://ideone.com/4ixjJ2) –

+0

Да, только что обновил ответ. @ Ответ JornVernee также действителен. – learner0000