JAVA 位运算

来源:百度知道 编辑:UC知道 时间:2024/06/20 13:23:20
问题1
byte b=(byte)0xf1
byte d=(byte)(b>>>4)

问题2
byte b=(byte)0xf1
byte e=(byte)((b&0xff)>>4)

我想问的是在问题1的d把b>>>4的时候会上升至int,那么
上升后的值是怎样的?
例如:0000 0000 1111 0001 还是怎样请打出来并解释

还有问题二,((b&0xff)>>4)在这里面有没有把值上升到int呢?还是以btye进行运算?如果上升后的int的十六进制是什么?请打来看看.

楼上是错的...

public class Test
{
public static void main(String[] args)
{
byte b=(byte)0xf1 ;
byte d=(byte)(b>>>4);
System.out.println(d);

byte a=(byte)0xf1;
byte e=(byte)((a&0xff)>>4);
System.out.println(e);
}
}

输出为
-1
15

解释如下:
问题1:
1.0xf1,这是直接书写的文字常量,java默认情况下表示int型,即0x000000f1
2.(byte)0xf1,是将int显示转化为byte,即强行截断取最低字节,即取0x000000f1的最低字节0xf1,所以得到的byte在内存里是0xf1,因为byte是有符号的,所以b是负数
3.位移会先将左边的数转化为int,再位移;负数扩展左边添1,所以0xf1扩展为0xfffffff1,添0右移4位结果是0x0fffffff
4.最后将int型的0x0fffffff显示转化为byte,即截断最低字节,得到0xff,即byte值的-1,所以输出为-1

问题2:
同理
1.(byte)0xf1是截断int值的最低字节得到0xf1,也是一个byte型负数
2.b&0xff,左边是byte型,右边的文字常量默认是int型,所以左边的byte先为扩展为0xffffffff的int型,与右边的int值位与,所以b&0xff的最终结果是int型的0x000000ff
3.将b&0xff按符号位扩展右移4位,得到0x0000000f,最后截断最低字节得到byte值0x0f,所以e为0x0f,输出得到15

ok,就是这样

1.byte a=(byte)0xf1;
System.out.prin