Итак, вчера на работе мне пришлось написать приложение для подсчета страниц в файле AFP. Таким образом, я стёр со своего PDF-файла спецификации MO: DCA и нашел структурированное поле BPG (Begin Page)
и его 3-байтовый идентификатор. Приложение должно работать на AIX, поэтому я решил написать его на Java.
Для максимальной эффективности я решил прочитать первые 6 байтов каждого структурированного поля, а затем пропустить оставшиеся байты в поле. Это дало бы мне:
0: Start of field byte
1-2: 2-byte length of field
3-5: 3-byte sequence identifying the type of field
Итак, я проверяю тип поля и увеличиваю счетчик страниц, если он равен BPG
, а я нет, если это не так. Затем я пропускаю оставшиеся байты в поле, а не читаю их. И здесь, в пропуске (и действительно в длине поля), я обнаружил, что Java использует подписанные байты.
Я немного погуглил и нашел довольно много полезной информации. Самой полезной, конечно же, была инструкция сделать побитовые &
до 0xff
, чтобы получить значение типа unsigned int. Это было необходимо для получения длины, которую можно использовать в расчете для количества пропускаемых байтов.
Теперь я знаю, что в 128 мы начинаем считать в обратном направлении от -128. Я хочу знать, как здесь работает побитовая операция, точнее, как я получаю двоичное представление для отрицательного числа.
Если я правильно понимаю побитовый &
, ваш результат будет равен числу, в котором установлены только общие биты ваших двух чисел. Итак, предполагая byte b = -128
, мы бы получили:
b & 0xff // 128
1000 0000-128
1111 1111 255
---------
1000 0000 128
Так как бы я прибыл в 1000 0000 за -128? Как бы я получил двоичное представление чего-то менее очевидного, например, -72 или -64?