我正在尝试获取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作为结果。
答案 0 :(得分:2)
这是因为>>>
(和其他二元运算符)将操作数提升到至少int
(如JLS Sec 15.19中所述)。在这种情况下,它们将被提升为完全 int
,然后结果为int
,因为左侧操作数的提升类型为int
。
您需要明确地转回byte
:
byte b1 = (byte) (b >>> 4);
或使用复合赋值(隐式为你演员):
byte b1 = b; b >>>= 4;