Java移位运算

[size=medium]
System.out.println("(byte)0xa7="+(byte)0xa7);
//结果是:-89.解释:0xa7=0000 0000 0000 0000 0000 0000 1010 0111 ,
//(byte)0xa7=1010 0111=-89

System.out.println("(byte)(0xa7>>>2)="+(byte)(0xa7>>>2));
//结果是:41.解释:0xa7>>>2=0000 0000 0000 0000 0000 0000 0010 1001=41,
//(byte)(0xa7>>>2) = 0010 1001=41

System.out.println("(byte)0xa7>>>2="+((int)((byte)0xa7>>>2)));
//结果是:1073741801.解释:(byte)0xa7>>>2 = -89>>>2=
//0011 1111 1111 1111 1111 1111 1110 1001 = 1073741801
//Java使用补码来表示二进制数,因此移位运算都是针对整型数的二进制补码进行。

System.out.println("(byte)0xa7>>>2="+((byte)((byte)0xa7>>>2)));
//结果是:-32.解释:(byte)0011 1111 1111 1111 1111 1111 1110 1001=
//1110 1001=-(0001 0111)=-23

System.out.println(Integer.toBinaryString((byte)0xa7>>>2));
//结果是:0011 1111 1111 1111 1111 1111 1110 1001

上面是我的分析,不知道是不是正解。
下面是恒叔的分析:
// TODO Auto-generated method stub
System.out.println((byte)0xa2>>>2);
//1073741800

System.out.println(Integer.toHexString((byte)0xa2));
//ffffffa2
System.out.println(Integer.toHexString((byte)127));
//0000007f

//由于162= (0xa2) 127 = (0x7f) 162大于 127 所以 0xa2转成byte时候溢出
//变成负数 负数在计算机内存中是补码形式存在 因此就是(byte)0xa2 = 0xffffffa2
//换算成二进制就是1111 1111 1111 1111 1111 1111 1010 0010
//不带符号右移2位就是
// 0011 1111 1111 1111 1111 1111 1110 1000
//这个时候0011 1111 1111 1111 1111 1111 1110 1000的最高位就不是1 是0 了 表示正数了
//然后你再把0011 1111 1111 1111 1111 1111 1110 1000变成十进制是多少 是不是 1073741800

注明:int = 4byte = 32bit
float = 4byte = 32bit
long = 8byte = 64bit
double = 8byte=64bit
short = 2byte = 16bit
char = 2byte = 16bit
byte = 8bit
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值