Итак, я долгое время создавал "наборы битов" в 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).
Как использовать оставшуюся часть длинного пространства в моем наборе битов?