计算机内部使用补码存放数值,移位运算均在 补码的基础上进行移位:为什么使用补码参见:http://www.cnblogs.com/dolphin0520/archive/2012/10/09/2711768.html
1、数值类型转换原则:如果最初的数值类型是有符号的,那么就执行符号扩展;如果是char类型,那么不管它要被转换成什么类型,都执行零扩展。如果目标类型的长度小于源类型的长度,则直接截取目标类型的长度。
2、移位运算分为有符号移位(>>、<<)和无符号移位(>>>、<<<):
针对有符号类型的数值(byte、short、int、long),有符号向右移位时,左侧自动补上符号位,无符号向右移位时,则自动补0。
针对无符号数值类型 (char),向右移位则补0。
所有左移操作,右侧则都补0。
3、对于char、byte、short类型数值,在移位前会先行转换为整形,然后进行移位。
4、移位 操作符和赋值符合并(比如>>=、<<=、>>>=、<<<=),该 操作符直接将移位后的值赋予源数据本身,如果涉及类型转换,则自动进行。比如short s = 1; s <<= 2; s向右移动两位后的整型结果自动转换为 short类型。
5、单纯移位操作并不会改变数值本身的值。
//无符号数 右移位,自动补0
char c = 65535; System.out.println("c=" + Integer.toBinaryString(c)); c>>=1; System.out.println("c=" + Integer.toBinaryString(c)); System.out.println("c=" + (c + 0));
输出结果:
c=1111111111111111 c=111111111111111 c=32767
byte b = -1;
System.out.println("b=" + Integer.toBinaryString(b));
int x = b >>> 1;
System.out.println("b=" + Integer.toBinaryString(b));//b的值未改变
System.out.println("x=" + Integer.toBinaryString(x));
System.out.println("x=" + x);
输出结果:
b=11111111111111111111111111111111 b=11111111111111111111111111111111 x=1111111111111111111111111111111 x=2147483647
byte b=-1;
b>>=25;
System.out.println("b=" + Integer.toBinaryString(b));//有符号移位,自动补充符号位,移位结果仍然位-1;
b>>>=24;
System.out.println("b=" + Integer.toBinaryString(b));//无符号移位,左侧自动补0,但整形截取为byte类型时,低8位仍然全为1,结构仍为-1;
b>>>=25;
System.out.println("b=" + Integer.toBinaryString(b));//当补0数到达低位一个字节时,数值发生改变。
System.out.println("b=" + b);
输出结果:
b=11111111111111111111111111111111 b=11111111111111111111111111111111 b=1111111 b=127
浙公网安备 33010602011771号