Неожиданное поведение при выполнении побитовых операций, делящих пополам пространство битов - PullRequest
0 голосов
/ 12 декабря 2018

Итак, я долгое время создавал "наборы битов" в java.

Я всегда думал, что если я использую long, у меня есть 64 бита для игры.

Однако у меня естьтеперь обнаружил, что это не так просто ...

И я подозреваю, что это связано с переполнением и приведением ...

long x = 1<< 30;
return x+ "="+ Long.toBinaryString(x);

Визуализации:

1073741824 =1000000000000000000000000000000

Ожидается.

Но:

long x = 1<< 31;
return x+ "="+ Long.toBinaryString(x);

Отображает:

-2147483648 = 11111111111111111111111111111111111111111111000000000000000000000000000000000000000000000000000000000000000000000000000000

?????

Я предполагаю, что это связано с тем, как рассчитывается длинное эквивалентное значение двоичного сдвига, а затем отображается как длинное.то есть он приводится к длинному, а затем вычисляется, и я полагаю, что это переполнение ...

Я ожидал

10000000000000000000000000000000

и длинныйзначение будет некоторое отрицательное число (не могу понять, что это такое)

1038 * Существует определенно 64 бит длинный в Java ..., как
Long.toBinaryString(Long.MAX_VALUE);

Оказывает:. 111111111111111111111111111111111111111111111111111111111111111 (64 1).

Как использовать оставшуюся часть длинного пространства в моем наборе битов?

1 Ответ

0 голосов
/ 12 декабря 2018

Это потому, что 1<< 31 - это int, равное Integer.MIN_VALUE, которое вы затем расширяете до long.

Сделайте первый операнд long:

1L << 31

Итак, это:

long x = 1L << 31;
return x+ "="+ Long.toBinaryString(x);

Возвращает :

2147483648=10000000000000000000000000000000
...