>"(右移)、"<<"(左移)、">>>"(无符号右移),比如下面这段 它...">
美文网首页程序员
java中左移、右移和无符号右移

java中左移、右移和无符号右移

作者: 会转圈儿的冷冷凉 | 来源:发表于2019-02-18 15:58 被阅读0次

我们在看某些jdk的源码时经常能看到">>"(右移)、"<<"(左移)、">>>"(无符号右移),比如下面这段


1550050893(1).jpg

它们经常被用来扩充动态集合的大小,下面我们看段代码看下">>"、"<<"、">>>"都做了什么操作。

我们写下面这段代码,先看左移

public class Main2 {
    public static void main(String[] args) {
        Integer aValue =10;
        show(aValue);
        Integer leftMoveValue1 =aValue <<1; //左移1位
        show(leftMoveValue1);
        Integer leftMoveValue2 =aValue <<2; //左移2位
        show(leftMoveValue2);
        Integer leftMoveValue3 =aValue <<2;//左移3位
        show(leftMoveValue3);
    }
    /**
     * 打印数字对应的二进制字符串
     * @param number
     */
    public static void show(Integer number)
    {
        //打印原值
        System.out.println(aValue);
        //打印值对应的二进制
        System.out.println(Integer.toBinaryString(number));
    }
}

结果是:

10
1010
20
10100
40
101000
80
1010000

原来的值为10

左移一位值为10*2的1次方   20
左移两位值为10*2的2次方   40
左移两位值为10*2的3次方   80

体现在二进制上,是将二进制的低位补0,既为左移

接下来我们将左移变成右移,代码如下:

public class Main2 {
    public static void main(String[] args) {
        Integer aValue =10;
        show(aValue);
        Integer leftMoveValue1 =aValue >>1; //右边移1位
        show(leftMoveValue1);
        Integer leftMoveValue2 =aValue >>2; //右移2位
        show(leftMoveValue2);
        Integer leftMoveValue3 =aValue >>2;//右移3位
        show(leftMoveValue3);
    }
    /**
     * 打印数字对应的二进制字符串
     * @param number
     */
    public static void show(Integer number)
    {
        //打印原值
        System.out.println(aValue);
        System.out.println(Integer.toBinaryString(number));
    }
}

结果是:

10
1010
5
101
2
10
1
1

原来的值为10

右移一位值为10/2的1次方   5
右移两位值为10/2的2次方   2
右移两位值为10/2的3次方   1

体现在二进制上,是将二进制的低位直接去掉,既为右移,右移n位相当于10/2的n次方

接下来我们将左移变成无符号右移,代码如下:

public class Main2 {
    public static void main(String[] args) {
        Integer aValue =10;
        show(aValue);
        Integer leftMoveValue1 =aValue >>>1; //无符号右边移1位
        show(leftMoveValue1);
        Integer leftMoveValue2 =aValue >>>2; //无符号右移2位
        show(leftMoveValue2);
        Integer leftMoveValue3 =aValue >>>2;//无符号右移3位
        show(leftMoveValue3);
    }
    /**
     * 打印数字对应的二进制字符串
     * @param number
     */
    public static void show(Integer number)
    {
       //打印原值
        System.out.println(aValue);
        System.out.println(Integer.toBinaryString(number));
    }
}

结果是:

10
1010
5
101
2
10
1
1

原来的值为10

无符号右移一位值为10/2的1次方   5
无符号右移两位值为10/2的2次方   2
无符号右移两位值为10/2的3次方   1

同为整数10时,我们看不到右移和无符号右移的区别

于是我们把右移中的值10变更为-10,先看看右移结果

-10>>1
-10>>2
-10>>3


-10
11111111111111111111111111110110
-5
11111111111111111111111111111011
-3
11111111111111111111111111111101
-2
11111111111111111111111111111110

我们看到,负数右移仍然是将二进制的最低位直接去掉,但是保证了位数不变,在最高位补了1,负数的右移反而变大了

我们继续看看无符号右移

-10>>>1
-10>>>2
-10>>>3

-10
11111111111111111111111111110110
2147483643
1111111111111111111111111111011
1073741821
111111111111111111111111111101
536870910
11111111111111111111111111110

负数进行无符号右移时变成了很大的正数。相当于是将低位去掉后,在高位补了0,
我后来又试了一下 -1左移一位时,恰好为2147483648,正好为Interge.maxValue的值
先这样吧...

后记:

以后再也不怕在源码中看见左移右移了,其实自己都能算出来的

相关文章

网友评论

    本文标题:java中左移、右移和无符号右移

    本文链接:https://www.haomeiwen.com/subject/jhideqtx.html