Давайте сделаем это один шаг за один раз.
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, таким образом гарантируя положительное число:
byte b = (byte) (0b11010100 << 1);
System.out.println(b); // -88. It is not possible to print 168 when printing a byte.
int asUnsigned = b & 0xFF;
System.out.println(asUnsigned); // 168.
// or in one go:
System.out.println(((byte) (0b11010100 << 1)) & 0xFF); // 168
int
s илиlong
s.