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中会提示我们有错误,如下图所示
这里介绍下移位的原理,<<表示左移,和符号没有关系,>>和>>>表示有符号右移和无符号右移,具体操作如下。
>>: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中会提示我们有错误,如下图所示
相关文章推荐
- Java<<、>>与>>>移位操作(二)
- java移位操作
- Java 移位操作
- Java中负数的移位操作——右移
- java中的移位操作
- Thinking in java Shift operators 移位操作 还有基本运算符。
- Java 移位操作
- Java 移位操作>>,<<,>>> 位逻辑运算符 &, |,~,^
- java之移位操作
- java的移位操作详解,左移和右移
- Java中的移位操作
- 用java实现数组的循环逐步移位操作
- Java基础之 移位操作
- Java中移位的操作
- java中char,byte,short的移位操作
- Java的移位操作(收集+纠正)
- Java移位操作、位运算详解
- java的移位操作详解,左移和右移
- Java中的移位操作
- java中的移位操作