Почему, когда я пытаюсь сдвинуть биты для 11010100 2 , результат будет 110101000 2 , а не 10101000 2 .
int a = Integer.parseInt("11010100", 2) << 1;
Я пытаюсь сделать это:
int a = (byte)(Integer.parseInt("11010100", 2) << 1);
Но если выходное значение больше 128, все идет в минус, что логично. Как сделать так, чтобы количество бит не менялось?
int
s илиlong
s.Ответы:
Давайте сделаем это один шаг за один раз.
Integer.parseInt("11010100", 2)
- это значение int 212. Это, кстати, ненужно; вы можете просто написать:0b11010100
.0b11010100 << 1
такой же, как0b110101000
и 424.Затем вы бросаете его в байт
(byte)(0b11010100 << 1)
. Биты после первых 8 все обрезаются, что оставляет 0b10101000, что составляет -88. Минус да, потому что в Java подписаны байты.Затем вы молча преобразуете этот -88 обратно в int, так как присваиваете ему значение int. Остается -88, что означает, что все старшие биты равны 1.
Следовательно, окончательное значение
-88
.Если вы хотите видеть
168
вместо этого (который является точно такими же битами, но показан без знака вместо подписанного), следует использовать обычную хитрость& 0xFF
, которая устанавливает все биты, кроме первых 8, в 0, таким образом гарантируя положительное число:источник
int a
, так что если у вас есть& 0xFF
, то вам не нужно вообще разыгрывать.int a = (0b11010100<< 1) & 0xFF;
Если вы хотите установить на 0 все биты выше, чем нижние 8 бит, вы можете использовать побитовое И:
Вывод:
источник
Попробуйте что-то вроде этого:
toUnsignedInt был представлен в Java SE 8.
источник