[Misc] 移位运算符,原码,反码,补码 - Gukie/learning GitHub Wiki
refer
- https://www.iteblog.com/archives/740.html (位移)
- https://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.html (原码,反码,补码)
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]补
之所以需要补码,是为了方便计算机计算负数; 在计算机中,只有加法,没有减法