→阿童沐

財富==支撐一個人生存多長時間的能力!

导航

Java移位操作-

java中共有3种移位操作符,分别为"<<"(左移位操作符)、">>"(右移位操作符)和">>>"(无差别右移位操作符)。

对于java语言中的移位操作需要注意以下3点:

1.移位操作的对象为整形(int)或者长整形(long),对于char、byte和short类型自动执行向上转型为int。

2.符号位参与到移位过程,对于"<<"和">>",移位是带符号的,在高位补与原符号位相同的数字,即正数高位补0,负

   数低位补1;对于">>>",移位操作是无差别的,在高位补0。

3.第三个问题是关于移位操作的宽度问题。移位宽度为截取移位操作的右操作数低五位得到的正整数,因此取值范围为0

   ~31(对于长整形为低6位,因此取值范围为0~63)。

下面是一个小例子:

public class Cycle {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        shift();
    }    
     
     public static void shift(){
         int i = -1;
         System.out.println(i + ":");
         System.out.println(Integer.toBinaryString(i));
         i = i >>> 31;
         System.out.println(i + ":");
         System.out.println(Integer.toBinaryString(i));
         
         int j = -1;
         j = j >> 1;
         System.out.println(j + ":");
         System.out.println(Integer.toBinaryString(j));
     }
}

一、

int value = Integer.parseInt("00001111101001011111000010101100",2);//即value=262533292

对int变量value执行<<32位操作,即value <<=32,这个结果是多少呢?
如果你觉得答案是0,那么错了,它的结果还是262533292。
不用怀疑java中int是32位的问题,而是你没有了解java的<<操作。
在java中无论左移右移,会遵循下面的规则

value<<n(其中value为int,n>=0) 等价于 value<<(n%32)
value>>n (其中value为int,n>=0) 等价于 value>>(n%32)
value>>>n (其中value为int,n>=0) 等价于 value>>>(n%32)

对于long类型的:
value<<n(其中value为long,n>=0) 等价于 value<<(n%64)
value>>n (其中value为long,n>=0) 等价于 value>>(n%64)
value>>>n (其中value为long,n>=0) 等价于 value>>>(n%64)

而对于byte、short、char遵循int的规则

二、
int value = Integer.parseInt("00001111101001011111000010101100",2);//即value=262533292
value <<= -38,这个结果是多少呢?
你可能认为它通不过编译,抑或你认为它从左移变成右移了?
然而,事实不是想象的那么简单,它的结果是-1342177280,这是怎么出来的?听我一一道来。
若是对int的值移负数位,java会截取那个负数的低5位。
-38的二进制表示是:11111111111111111111111111011010,截取低5位得:11010,这个数是26,也就是说:
value <<= -38 等价于 value <<= 26,得到的二进制是10110000000000000000000000000000,首位为1,
所以该二进制是补码,换成其绝对值的源码为01010000000000000000000000000000,对应的十进制为1342177280,
加上负号就是-1342177280。
对于int是取低5位,对于long是取低6位
也就是说:
value << -n(value为int,n>=0) 等价于 value << (-n & 31)
value >> -n(value为int,n>=0) 等价于 value >> (-n & 31)
value >>> -n(value为int,n>=0) 等价于 value >>> (-n & 31)

而对于long
value << -n(value为long,n>=0) 等价于 value << (-n & 63)
value >> -n(value为long,n>=0) 等价于 value >> (-n & 63)
value >>> -n(value为long,n>=0) 等价于 value >>> (-n & 63)

而对于byte、short、char遵循int的规则

 

转自:

http://www.cnblogs.com/liuriu/archive/2011/10/12/2208711.html

http://hi.baidu.com/freish/blog/item/7dc95c0f53028d206159f3ef.html

posted on 2012-05-06 22:06  阿童沐  阅读(382)  评论(0)    收藏  举报