Java软件低级错误(十二):Java的移位(>>和>>>)运算问题

 解读

   运算符>>指的是对它左边的操作数带符号右移位。我们知道数据的补码表示,如果是负数,那么它的最高位是1,所以右移位操作时左边的空缺用1填补。

   运算符>>>也是右移,但它与>>的区别是对于负数,右移不是用1填补,而是用0填补。也就是>>>不考虑数的正负,机械地移位就是了。

   另外:>>>的左边操作数如果是char,byte,short,运算前会先转换成int,运算结果也就成了int,如果再对运算后的结果int强制类型转换到byte,那它只会机械地截取数据的最右边8位。

案例

 

程序一

byte i = (byte)0xf3;//二进制:11110011

byte j = (byte)(i >>> 3);

System.out.printf("%x", j);

程序二

byte i = (byte)0xf3;//二进制:11110011

byte j = (byte)((i & 0xff) >>> 3);

System.out.printf("%x", j);

 

程序1的运行结果是:fe,也就是二进制:11111110( 0xf3转换为整型后会变成fffffff3,二进制为11111111111111111111111111110011,移位3位后变成00011111111111111111111111111110,转换为byte,结果自然为11111110 ),而不是预期的结果:1e,也就是二进制:00011110。

程序2中将操作数移位前与0xff作一次按位与运算后得到预期的结果(这里0xff是整型,完整的写法是0x000000ff,因此0xf3 & 0xff的结果为000000f3,该值右移三位再转换为byte的值为1e)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值