需要了解二进制码,5 的 二进制码是 101, java 提供方法可以将十进制转换成二进制
将 5 转换成二进制
Integer.toUnsignedString(5, 2); 101
正数 符号位为0,负数符号数为1
负数在计算机内以补码显示 -5 的原码如下
10000000000000000000000000000101 原码
按位取反得到原码
11111111111111111111111111111010 反码
反码加1得到补码
11111111111111111111111111111011 补码
正数的原码与补码相同
5 的原码如下:
00000000000000000000000000000101 原码
01111111111111111111111111111010 反码
00000000000000000000000000000101 补码
左右(<<)右移(>>)就是将反码按对应的位运算向左(补0)或向右移动(补1或补0)
5 >> 1 结果 10000000000000000000000000000010
System.out.println(5>>1); //2
System.out.println(Integer.toUnsignedString(5>>1, 2)); //10(打印时符号位和0会被省略)
5 << 1 结果 10000000000000000000000000001010
System.out.println(5<<1); //10
System.out.println(Integer.toUnsignedString(5<<1, 2)); //1010
-5 >> 1 结果
补码 11111111111111111111111111111101
转换成反码(补码 -1) 11111111111111111111111111111100
装换成原码 (除符号位安位取反)10000000000000000000000000000011 (-3)
System.out.println(Integer.toUnsignedString(-5, 2)); //11111111111111111111111111111011
System.out.println(-5>>1); //-3
System.out.println(Integer.toUnsignedString(-5>>1, 2));//11111111111111111111111111111101
-5 << 1 结果
补码 11111111111111111111111111110110
转换成反码(补码 -1) 11111111111111111111111111110101()
装换成原码 (除符号位安位取反)10000000000000000000000000001010 (-10)
无符号右移预算符( >>>) 符号位也参与移动原位置将补0,这样就说明负数经过无符号右移后(>>>)将变为整数。
代码对比
System.out.println(Integer.toUnsignedString(-5, 2));//11111111111111111111111111111011
System.out.println(-5>>1);//-3
System.out.println(Integer.toUnsignedString(-5>>1, 2)); //11111111111111111111111111111101
System.out.println(-5>>>1);//2147483645
System.out.println(Integer.toUnsignedString(-5>>>1, 2));// 1111111111111111111111111111101(注意符号为 0 省略了)