Итак, вчера на работе мне пришлось написать приложение для подсчета страниц в файле AFP. Итак, я отряхнул пыль со своего PDF-файла MO: DCA spec и нашел структурированное поле 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. Что я хочу знать, так это то, как здесь работает побитовая операция - точнее, как я прихожу к двоичному представлению отрицательного числа.
Если я правильно понимаю побитовые и
, ваш результат будет равен на число, в котором установлены только общие биты ваших двух чисел. Итак, если предположить, что байт b = -128
, у нас будет:
b & 0xff // 128
1000 0000-128
1111 1111 255
---------
1000 0000 128
Итак, как я могу получить 1000 0000 для -128? Как мне получить двоичное представление чего-то менее очевидного, например -72 или -64?