公共类UnsignedShift {
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;
byte d = (byte)(b>>>4);
System.out.println("b>>>4=0x" + hex[(d>>4)&0x0f] + hex[d&0x0f]);
}
}
结果= 0xff
任何人都可以解释在Java中它是如何实现的吗?
我认为,它是0x0f
答案 0 :(得分:1)
java中没有可以直接使用字节(8位)操作的二元运算符。类型为byte,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)
轻松打印十六进制格式的整数。
答案 1 :(得分:0)
字节b =(字节)0xf1将是1111 0001
字节d =(字节)(b>>> 4)将是1111 1111
d>> 4将是11111111
0x0f将为00001111
(d>> 4)& 0x0f将为00001111 == 15
d将是11111111
0f将是00001111
hex [d& 0x0f]将为00001111 == 15
所以最终答案:0xff
我认为您期望(字节)(b>>>> 4)将0从左向右移动4次。但是b是一个32位的整数,它将从左移动4个字节但被(byte)转换忽略。字节转换取整数的8个最低有效位。