您的位置:首页 > 编程语言 > Java开发

java中的移位操作

2013-03-09 16:12 225 查看
其实计算机中的数值用补码来表示,主要目的一是防止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中会提示我们有错误,如下图所示

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: