Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java中使用bitshift操作符_Java - Fatal编程技术网

如何在Java中使用bitshift操作符

如何在Java中使用bitshift操作符,java,Java,我试图获取一个字节的前4位作为另一个数字。所以我写了这样的东西: byte b = (byte)0xF4; byte b1 = b >>> 4; 为什么Java中不允许使用第二条语句 编辑: 我在回答中做了修改,结果是回答0xFF,但预期是0x0F 然后我尝试用二进制表示值,并注意到: System.out.println(Integer.toBinaryString(0xF1)); System.out.println(Integer.toBinaryString((byt

我试图获取一个
字节的前4位作为另一个数字。所以我写了这样的东西:

byte b = (byte)0xF4;
byte b1 = b >>> 4;
为什么Java中不允许使用第二条语句

编辑:

我在回答中做了修改,结果是回答0xFF,但预期是0x0F

然后我尝试用二进制表示值,并注意到:

System.out.println(Integer.toBinaryString(0xF1));
System.out.println(Integer.toBinaryString((byte)0xF1));
System.out.println(Integer.toBinaryString((byte)0xF1 >>> 4));
System.out.println(Integer.toBinaryString(0xF1 >>> 4));
输出:

11110001
11111111111111111111111111110001
11111111111111111111111111111111
1111
很简单,0xF1和(字节)0xF1是不同的数字。和运算符(>>>)在一种情况下添加零,在另一种情况下添加单位


因此,我需要将0xF4赋值给字节b(有符号),就像它是无符号字节一样,然后进行位移位并接收0x0F作为结果。

这是因为
>
(和其他二进制运算符)将操作数提升到至少
int
(如中所述)。在这种情况下,它们被提升为正好
int
,结果是
int
,因为左侧操作数的提升类型是
int

您需要显式转换回
字节

byte b1 = (byte) (b >>> 4);
或者使用复合赋值(隐式为您强制转换):


有编译错误吗?它说什么?你有什么错误?
byte b1 = b; b >>>= 4;