Смысл этой задачи в том, видимо, чтобы пояснить один момент с методом write(), вызванном на объекте OutputStream. На самом деле туда нельзя записать тип int, потому что значение будет приведено в типу byte в конечном счёте. Отсюда следует, что нужно int-значение разделить на байты, то есть на 4 части.
Как разделить int на байты я разобрался, написав такой метод:
public static byte[] intToBytes(int value){
byte[] bytes = new byte[4];
bytes[0] = (byte)value;
bytes[1] = (byte)(value >> 8);
bytes[2] = (byte)(value >> 16);
bytes[3] = (byte)(value >> 24);
return bytes;
}
Однако, с обратным преобразованием байтов в int есть недопонимание. Способ "склейки" байтов в int я нашёл, вот он:
public static int intFromBytes(byte[] bytes){
if (bytes.length != 4)
throw new IllegalArgumentException();
int value = ((bytes[3] & 0xFF) << 24) + ((bytes[2] & 0xFF) << 16) + ((bytes[1] & 0xFF) << 8) + (bytes[0] & 0xFF);
return value;
}
Что не понятно: почему операция & 0xFF приводит в обнулению старших битов? Вот скрин из дебагера:
Насколько я знаю, 1 & 1 = 1, а на деле (скрин) получается 0. Не понятно, почему это так?
Пояснение к скрину:
первые 4 байта - исходные данные
следующие 4 байта - результат, полученный в методе выше (с операцией & 0xFF)
последние 4 байта - результат, полученный в том же методе, только без операции & 0xFF
ДОПОЛНИТЕЛЬНОЕ ПОЯСНЕНИЕ
Я знаю, что есть PrintWriter(), который решает данную задачу. Вопрос вообще не в том, как задачу решить, а в том, почему 0xFF приводит в обнулению старших битов?