一、前备知识:计算机数据表示(原码、反码和补码)
1.1、符号位
对于正数,符号位在最高位用0表示;
对于负数,符号位在最高位用1表示;
1.2、对于正数
原码=反码=补码
1.3、对于负数
反码=原码的符号位不变,其他位按位取反;
补码=反码+1;
1.4、举例
数值 | 原码 | 反码 | 补码 |
---|---|---|---|
5 | 0000 0101 | 0000 0101 | 0000 0101 |
-5 | 1000 0101 | 1111 1010 | 1111 1011 |
二、移位运算
2.1、举例
-36<<1
-36>>1
-36>>>1
2.2、分析
-36
原码:1000 0000 0000 0000 0000 0000 0010 0100
反码:1111 1111 1111 1111 1111 1111 1101 1011
补码:1111 1111 1111 1111 1111 1111 1101 1100
-36>>1 (右移运算,符号位不变,低位移除,高位补符号位)
补码:1111 1111 1111 1111 1111 1111 1110 1110
反码:1111 1111 1111 1111 1111 1111 1110 1101
原码:1000 0000 0000 0000 0000 0000 0001 0010
计算得出:-18
-36>>>1(无符号右移,低位移除,高位补零)
补码:0111 1111 1111 1111 1111 1111 1110 1110
反码:0111 1111 1111 1111 1111 1111 1110 1110
原码:0111 1111 1111 1111 1111 1111 1110 1110
计算得出:2147483630
2.3、代码验证
public void movePosition(){
int a=-36;
int b=2;
int c=abs(a)>>b; // 36/4=9
int e=abs(a)>>>b; // 36/4=9
int d=abs(a)<<b; // 36*4=144
int f=a>>1; // -36/2=-18
int g=a>>>1; // 2147483630
int h=a<<1; // -36
System.out.println(""+c+" "+e+" "+d);
System.out.println(""+f+" "+g+" "+h);
}