Давайте зробимо це покроково.
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.