如何在Java中使用bitshift运算符

时间:2017-09-07 11:58:00

标签: java

我正在尝试获取byte个数字的前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作为结果。

1 个答案:

答案 0 :(得分:2)

这是因为>>>(和其他二元运算符)将操作数提升到至少int(如JLS Sec 15.19中所述)。在这种情况下,它们将被提升为完全 int,然后结果为int,因为左侧操作数的提升类型为int

您需要明确地转回byte

byte b1 = (byte) (b >>> 4);

或使用复合赋值(隐式为你演员):

byte b1 = b; b >>>= 4;