公共类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
发布于 2014-12-13 11:23:18
java中没有可以直接操作字节(8位)的二进制运算符。byte、short或char类型的变量在按照here中的详细说明执行此类操作之前,会自动经历“数值提升”到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; // 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)轻松地打印十六进制格式的整数。
发布于 2014-12-13 11:32:00
字节b=(字节) 0xf1将为1111 0001
字节d=(字节)(b>>>4)将为1111 1111
d>>4将为11111111
0x0f将为00001111
(d>>4)&0x0f将为00001111 == 15
D将是11111111
0f将是00001111
十六进制和0x0f将是00001111 == 15
所以最终答案是: 0xff
我认为您期望(byte)(b>>>4)将0从左移到右4次。但是b是一个32位的整数,它将向左移动4个字节,但会被(字节)转换忽略。字节转换取整数的8个最低有效位。
https://stackoverflow.com/questions/27454923
复制相似问题