先浅谈二进制:(以4位为例,8位、16位、32位则以此类推)
四位 0000 第一位是符号位 0代表正,1代表负
如下圆环以0为起点,顺时针加1 逆时针减一
数字 二进制
0 0000
1 0001
2 0010
3 0011
4 0100
5 0101
6 0110
7 0111
如图 显示 -1 和7 在圆环的一个点上 则 把符号位改为 1 则表示负数,即
-1 1111
以此类推
-2 1110
-3 1101
...
-8 1000
网上关于原码、反码和补码的文章有很多 可以对比理解,其实就是用补码表示负数。
走入正题,关于右移运算符>> 和 >>>
>> 高位补符号位,即是正数补0,负数补1
>>> 高位补0
正数的 >> 和 >>> 运算结果是一样的
例如:
public static void main(String[] args) {
int i1 = 16;
System.out.println(i1>>2);//4
System.out.println(i1>>>2);//4
}
这里是用JAVA为例子,在java中int类型为4个字节 32为
16 0000 0000 0000 0000 0000 0000 0001 0000
所以不管是 >> 还是>>> 运算高位都是补0,运算结果二进制如下:
16>>2 0000 0000 0000 0000 0000 0000 0000 0100 //结果是4
负数的运算结果则是不一样的:
public class Demo1 {
public static void main(String[] args) {
int i2 = -16;
System.out.println(i2>>2);//-4
System.out.println(i2>>>2);//1073741820
}
}
-16的原码 1000 0000 0000 0000 0000 0000 0001 0000
-16的反码 1111 1111 1111 1111 1111 1111 1110 1111
-16的补码 1111 1111 1111 1111 1111 1111 1111 0000 (-16反码的基础上加1)
-16 >> 2 1111 1111 1111 1111 1111 1111 1111 1100 -4
-16>>>2 0011 1111 1111 1111 1111 1111 1111 1100 1073741820