前言
咱们都晓得对于有符号数据类型,二进制最左端的数字为符号位,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    }