[Misc] 移位运算符,原码,反码,补码 - Gukie/learning GitHub Wiki

refer

summary

  • 跟>>>都是右移运算符,相当于除法,结果为商

  • << 是左移运算符,相当于乘法

跟 >>>的区别是:

  • 正整数的化,他们没有区别,都是相当于除法
  • 负数的化,>>得到的是一个负数,而>>>得到的有可能是正数,因为它是高位是补零的
        System.out.println("10: "+Integer.toBinaryString(10));
        System.out.println("10>>2: "+(10>>2)); // 除于 2的2次方
        System.out.println("10>>>2: "+(10>>>2));
        System.out.println(Integer.toBinaryString(10>>2));
        System.out.println(Integer.toBinaryString(10>>>2));

        System.out.println();
        System.out.println("-15: "+Integer.toBinaryString(-15));
        System.out.println("-15>>2: "+(-15>>2));
        System.out.println("-15>>>2: "+( -15 >>> 1) ); // 高位会补零,得到的可能会是一个正数
        System.out.println(Integer.toBinaryString(-15>>2));
        System.out.println(Integer.toBinaryString(-15>>>1));

        System.out.println();
        System.out.println(Integer.toBinaryString(4));
        System.out.println("4<<2: "+(4<<2)); // 乘以2的2次方
        System.out.println("-4<<2: "+(-4<<2));
        System.out.println(Integer.toBinaryString(4<<2));
        System.out.println(Integer.toBinaryString(-4<<2));

输出:

10: 1010
10>>2: 2
10>>>2: 2
10
10

-15:11111111111111111111111111110001
-15>>2: -4
-15>>>2: 2147483640
11111111111111111111111111110001
1111111111111111111111111111000

100
4<<2: 16
-4<<2: -16
10000
11111111111111111111111111110000

原码,反码,补码

正数的 原码,反码,补码,是一样的 负数的是: 反码: 第一位保持1,其他取反 补码: 在反码的基础上+1

[+1] = [00000001]原 = [00000001]反 = [00000001]补
[-1] = [10000001]原 = [11111110]反 = [11111111]补

之所以需要补码,是为了方便计算机计算负数; 在计算机中,只有加法,没有减法