在HashMap中看到这么一段代码:
static int hash(Object x) {
        int h = x.hashCode();        h += ~(h << 9);
        h ^=  (h >>> 14);
        h +=  (h << 4);
        h ^=  (h >>> 10);
        return h;
    }一直搞不明白 其中的">>>"是什么操作符?????

解决方案 »

  1.   

    无符号右移运算符 (>>>)右移表达式的位,不保留符号。result = expression1 >>> expression2参数
    result任何变量。expression1任何表达式。expression2任何表达式。说明
    >>> 运算符把 expression1 的各个位向右移 expression2 指定的位数。右移后左边空出的位用零来填充。移出右边的位被丢弃。例如: var temp
    temp = -14 >>> 2变量 temp 的值为 -14 (即二进制的 11111111 11111111 11111111 11110010),向右移两位后等于 1073741820 (即二进制的 00111111 11111111 11111111 11111100)。 
      

  2.   

    int x = 0x80000000;
            //对应二进制数为1000,0000,0000,0000,0000,0000,0000,0000
            int y;
            y = x>>1;//前面补1变成
            //1100,0000,0000,0000,0000,0000,0000,0000,0000
            System.out.println(y);//-1073741824
    int x = 0x80000000;
    //对应二进制数为1000,0000,0000,0000,0000,0000,0000,0000
    int y;
    y = x>>>1;//前面补1变成
    //0100,0000,0000,0000,0000,0000,0000,0000,0000
    System.out.println(y);
    //我们知道二进制数最前面一位代表正负0为正1为负
    //>>>和>>
    //>>>是不管以前是多少直接在前面补0
    //>>是以前前面是1就补1是0就补0
    //移位中要注意的:
    //低于int的 编译器先把数据提升为int再移位
    //int是32位数据所以移位33和移位1效果是一样的 
    //同理long是64为数据移位65和移位1效果是一样的
    //可以这样说a>>b移位实际是 b除以a的数据位数(32或64)再取模
    //移位不会改变变量的的值 比如a>>1这毫无意义; b=a>>1才有意义
    //x>>1与x/2结果一样 x<<2和x*4结果也一样
    //总之一个数左移n位等于这个数乘以2的n次方
    //右移n位等于这个数除以2的n次方
      

  3.   

    int x = 0x80000000;
            //对应二进制数为1000,0000,0000,0000,0000,0000,0000,0000
            int y;
            y = x>>1;//前面补1变成
            //1100,0000,0000,0000,0000,0000,0000,0000,0000
            System.out.println(y);//-1073741824
    int x = 0x80000000;
    //对应二进制数为1000,0000,0000,0000,0000,0000,0000,0000
    int y;
    y = x>>>1;//前面补1变成
    //0100,0000,0000,0000,0000,0000,0000,0000,0000
    System.out.println(y);
    //我们知道二进制数最前面一位代表正负0为正1为负
    //>>>和>>
    //>>>是不管以前是多少直接在前面补0
    //>>是以前前面是1就补1是0就补0
    //移位中要注意的:
    //低于int的 编译器先把数据提升为int再移位
    //int是32位数据所以移位33和移位1效果是一样的 
    //同理long是64为数据移位65和移位1效果是一样的
    //可以这样说a>>b移位实际是 b除以a的数据位数(32或64)再取模
    //移位不会改变变量的的值 比如a>>1这毫无意义; b=a>>1才有意义
    //x>>1与x/2结果一样 x<<2和x*4结果也一样
    //总之一个数左移n位等于这个数乘以2的n次方
    //右移n位等于这个数除以2的n次方
      

  4.   

    int x = 0x80000000; 
            //对应二进制数为1000,0000,0000,0000,0000,0000,0000,0000 
            int y; 
            y = x>>1;//前面补1变成 
            //1100,0000,0000,0000,0000,0000,0000,0000,0000 
            System.out.println(y);//-1073741824 
    int x = 0x80000000; 
    //对应二进制数为1000,0000,0000,0000,0000,0000,0000,0000 
    int y; 
    y = x>>>1;//前面补1变成 
    //0100,0000,0000,0000,0000,0000,0000,0000,0000 
    System.out.println(y); 
    //我们知道二进制数最前面一位代表正负0为正1为负 
    //>>>和>> 
    //>>>是不管以前是多少直接在前面补0 
    //>>是以前前面是1就补1是0就补0 
    //移位中要注意的: 
    //低于int的 编译器先把数据提升为int再移位 
    //int是32位数据所以移位33和移位1效果是一样的 
    //同理long是64为数据移位65和移位1效果是一样的 
    //可以这样说a>>b移位实际是 b除以a的数据位数(32或64)再取模 
    //移位不会改变变量的的值 比如a>>1这毫无意义; b=a>>1才有意义 
    //x>>1与x/2结果一样 x < <2和x*4结果也一样 
    //总之一个数左移n位等于这个数乘以2的n次方 
    //右移n位等于这个数除以2的n次方
      

  5.   

    Java中有三个移位运算符
    左移:<<
    带符号右移:>>
    无符号右移:>>>