考虑以下Java代码片段
byte b=(byte) 0xf1; byte c=(byte)(b>>4); byte d=(byte) (b>>>4);
输出:
c=0xff d=0xff
预期输出:
c=0x0f
怎么样?作为1111 0001 无符号右移后的二进制形式的b,0000 1111因此0x0f为什么0xff 呢?
1111 0001
0000 1111
0x0f
0xff
问题在于,int在进行移位操作之前,所有参数都首先被提升为:
int
byte b = (byte) 0xf1;
b 已签名,因此其值为-15。
b
byte c = (byte) (b >> 4);
b首先将符号扩展为整数-15 = 0xfffffff1,然后向右移,0xffffffff并通过强制转换为截断0xff为byte。
-15 = 0xfffffff1
0xffffffff
byte
byte d = (byte) (b >>> 4);
b首先将符号扩展为整数-15 = 0xfffffff1,然后向右移,0x0fffffff并通过强制转换为截断0xff为byte。
0x0fffffff
您可以做(b & 0xff) >>> 4以获得所需的效果。
(b & 0xff) >>> 4