Там нет бинарных операторов в Java, которые могут работать непосредственно с байтами (8 бит). Переменные байтов типа, short или char автоматически переносят «числовое продвижение» до 32-битного целого числа до того, как такие операции выполняются, как описано в here. Так вот то, что происходит в вашем коде:
public static void main(String[] args) {
char hex[] = new char[] {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
byte b = (byte) 0xf1; // b is a byte with 0xf1
byte d = (byte)(b>>>4); // b is converted to int, becoming 0xfffffff1 then shifted
// to the right by 4 bits, resulting in 0x0fffffff
System.out.println("b>>>4=0x" + hex[(d>>4)&0x0f] + hex[d&0x0f]);
}
Если вы хотите, чтобы получить это право его просто проще использовать 32-битные переменные для всех бинарных операций, как в примере ниже:
public static void main(String[] args) {
char hex[] = new char[] {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
byte b = (byte) 0xf1;
int ib = b & 0xff;
byte d = (byte)(ib>>>4);
System.out.println("b>>>4=0x" + hex[(d>>4)&0x0f] + hex[d&0x0f]);
}
Примечание: на всякий случай вы не знаете, вы можете легко напечатать целочисленное число в шестнадцатеричном формате, вызвав Integer.toHexString(n)
.