Java中的>>,>>>

前言
我们都知道对于有符号数据类型,二进制最左端的数字为符号位,0代表正,1代表负,这里先介绍几个概念

逻辑左移=算术左移:高位溢出,低位补0
逻辑右移:低位溢出,高位补0
算术右移:低位溢出,高位用符号位的值补

比如一个有符号位的8位二进制数10101010,[]是添加的数字

逻辑左移一位:0101010[0]
逻辑左移两位:101010[00]

算术左移一位:0101010[0]
算术左移两位:101010[00]

逻辑右移一位:[0]1010101
逻辑右移两位:[00]101010

算术右移一位:[1]1010101
算术右移两位:[11]101010

算术左移和算术右移主要用来进行有符号数的倍增、减半
逻辑左移和逻辑右移主要用来进行无符号数的倍增、减半
(Java中是没有无符号数据类型的,C和C++中有)

符号 例子 解释
<< num<< n 相当于 num×2n,算数左移(逻辑左移)

num>>n 相当于num2n,算数右移

num>>>n 逻辑右移,当num为正数和算术右移一个效
  @Test
    public void test1() {
      //  System.out.println(1<<1);
      //  System.out.println((float) (1>>1));
        int num = 10;
        System.out.println(Integer.toBinaryString(0));
        System.out.println(Integer.toBinaryString(1));
        System.out.println(Integer.toBinaryString(2));
        System.out.println(Integer.toBinaryString(3));
        System.out.println(Integer.toBinaryString(4));
        System.out.println(Integer.toBinaryString(5));
        System.out.println(Integer.toBinaryString(100));
        System.out.println("-------------");
        //System.out.println(Integer.toBinaryString(6));
        System.out.println(Integer.toBinaryString(8));
        System.out.println(Integer.toBinaryString(16));
        System.out.println(Integer.toBinaryString(13));
        System.out.println(Integer.toBinaryString(~13));
        System.out.println("-------------");
        System.out.println(Integer.toBinaryString(num));
        System.out.println(Integer.toBinaryString(num << 1));
        System.out.println(Integer.toBinaryString(num>>1));
        System.out.println(Integer.toBinaryString(num>>2));
        System.out.println(Integer.toBinaryString(num>>4));

        System.out.println("---------------");
        System.out.println(Integer.toBinaryString(2 & 3));
        System.out.println(Integer.toBinaryString(2 | 3));
        System.out.println(Integer.toBinaryString(~2));
        System.out.println(Integer.toBinaryString(~3));

        System.out.println("---------------");

        System.out.println(200 & ~200);

        System.out.println("---------------");

        //   无符号右移运算符>>> 只是对32位和64位的值有意义
        System.out.println(Integer.toBinaryString(~2>>>4));
        System.out.println(Integer.toBinaryString(~2>>>33));


        // 20
        System.out.println(10 << 1);
        // -20
        System.out.println(-10 << 1);
        // 5
        System.out.println(10 >> 1);
        // -5
        System.out.println(-10 >> 1);
        // 5
        System.out.println(10 >>> 1);
        // 2147483643
        System.out.println(-10 >>> 1);

//        result:

//        0
//        1
//        10
//        11
//        100
//        101
//        1100100
//                -------------
//                1000
//        10000
//        1101
//        11111111111111111111111111110010
//                -------------
//                1010
//        10100
//        101
//        10
//        0
//                ---------------
//                10
//        11
//        11111111111111111111111111111101
//        11111111111111111111111111111100
//                ---------------
//                0
//                        ---------------
//                1111111111111111111111111111
//        1111111111111111111111111111110
//        20
//                -20
//        5
//                -5
//        5
//        2147483643
    }

你可能感兴趣的:(java)