java中的移位操作

        其实计算机中的数值用补码来表示,主要目的一是防止0有两种编码,二是将减法用加法表示方面电路设计,或者说电路只能进行加法运算,所以把负数变成补码后就相当于加法运算。正数的补码和它的源码相同,负数的补码则不同。所以对于移位而言,如果是负数,从我们的角度来看,应该是先写出这个负数的正数对应的补码,即为该负数的值,然后进行移位;移位的结果中,如果高位为0表示这个移位后的结果为正数;反之为负数,这时可以求它的补码来求得该负数的值,具体可以见下面的例子。

         这里介绍下移位的原理,<<表示左移,和符号没有关系,>>和>>>表示有符号右移和无符号右移,具体操作如下。

>>:int a = -2; int b = (a>>2);结果b为-1,过程为:

2对应的二进制位(由于int为4字节)0000 0000 ......00000010

所以-2对应的二进制为:对2的二进制先求补码1111 1111 ......11111110

右移两位,高位补1,得到1111 1111 ......1111 1111由于高位为1,所以这是个负数,负数的值可以通过对此求补码来看到,补码为0000 0000 ...... 0000 0001,所以移位后的结果为-1。

>>>:int a = -2; int b = (a>>2);结果b为1073741823,过程为:

2对应的二进制位(由于int为4字节)0000 0000 ......00000010

所以-2对应的二进制为:对2的二进制先求补码1111 1111 ......11111110

右移两位,高位补0,得到0011 1111 ......1111 1111由于高位为0,所以移位的结果为正数,即这就是结果,这个结果0011 1111 ...... 1111 1111对应的十进制就是1073741823。

<<:int a = -2; int b = (a>>2);结果b为,过程为:

2对应的二进制位(由于int为4字节)0000 0000 ......00000010

所以-2对应的二进制为:对2的二进制先求补码1111 1111 ......11111110

左移两位,低位补0,得到1111 1111 ...... 1111 1000,由于高位为1,所以这个移位的结果为负数,对此求补码,就可以知道这个负数的值,补码为0000 0000 ...... 0000 1000,补码的结果为8,所以对应的负数为-8。

         另外,需要注意的是,对于如下代码

int i=-1; 

int j=i>>>35;

java在运行的时候是这样的:由于int是4字节32位的,所以在进行移位时实际是取的移位数35的模,即35mod32为3,相当于移位了3位,而不是移动了35位,这一点要格外注意。

         还有就是java在对char byte short进行移位的时候,在移位前,会将他们自动转成int型,然后在进行移位。注意,转成了int和不转成int的移位效果有时候区别是很大。而且在java中会提示我们有错误,如下图所示


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值