[英]Bitwise Operator
公共类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
Java中没有二进制运算符可以直接使用字节(8位)进行运算。 在执行类似此处所述的操作之前,类型为byte,short或char的变量会自动进行“数字提升”为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)
轻松地以十六进制格式打印整数。
字节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
我认为您期望(byte)(b >>> 4)从左移到右4次。 但是b是一个32位的整数,它将向左移动4个字节,但被(字节)转换忽略。 字节转换采用整数的8个最低有效位。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.