如何在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;