移位操作符种类:
- 左移 <<
- 右移 >>
- 无符号右移 >>>
移位操作符的操作对象:二进制位,只能处理整数类型。
注:1、左移<<操作无正负区别,左移几位就在其二进制形式右端低位补几个0;
2、右移操作<<有符号之分,正数右移,高位补0,负数右移高位补1;
3、无符号右移>>>,一律在高位补0。
示例程序:
示例1:左移操作
程序运行结果:
运行结果:
int a = 20;
System.out.println("a = " + a + " #Binary: " + Integer.toBinaryString(a));
a = a << 2; //等价于 a <<= 2;
System.out.println("a = " + a + " #Binary: " + Integer.toBinaryString(a));
System.out.println("-----------------------------------");
a = -20;
System.out.println("a = " + a + " #Binary: " + Integer.toBinaryString(a));
a = a << 2; //等价于 a <<= 2;
System.out.println("a = " + a + " #Binary: " + Integer.toBinaryString(a));
结果是:a = 20 #Binary: 10100
a = 80 #Binary: 1010000
-----------------------------------
a = -20 #Binary: 11111111111111111111111111101100
a = -80 #Binary: 11111111111111111111111110110000
注:这里二进制是32位,只不过显示形式中左端全0的部分是默认省略的。
注:负数在机器中是用其二进制补码表示的,-20的8位形式原码是10010100,反码是11101011,补码是11101100。
示例1:右移操作
int a = 20;
System.out.println("a = " + a + " #Binary: " + Integer.toBinaryString(a));
a = a >> 2; //等价于 a >>= 2;
System.out.println("a = " + a + " #Binary: " + Integer.toBinaryString(a));
System.out.println("-----------------------------------");
a = -20;
System.out.println("a = " + a + " #Binary: " + Integer.toBinaryString(a));
a = a >> 2; //等价于 a >>= 2;
System.out.println("a = " + a + " #Binary: " + Integer.toBinaryString(a));
程序运行结果:a = 20 #Binary: 10100
a = 5 #Binary: 101
-----------------------------------
a = -20 #Binary: 11111111111111111111111111101100
a = -5 #Binary: 11111111111111111111111111111011
实例3:无符号右移 int a = 20;
System.out.println("a = " + a + " #Binary: " + Integer.toBinaryString(a));
a = a >>> 2; //等价于 a >>>= 2;
System.out.println("a = " + a + " #Binary: " + Integer.toBinaryString(a));
System.out.println("-----------------------------------");
a = -20;
System.out.println("a = " + a + " #Binary: " + Integer.toBinaryString(a));
a = a >>> 2; //等价于 a >>>= 2;
System.out.println("a = " + a + " #Binary: " + Integer.toBinaryString(a));
程序运行结果:
a = 20 #Binary: 10100
a = 5 #Binary: 101
-----------------------------------
a = -20 #Binary: 11111111111111111111111111101100
a = 1073741819 #Binary: 111111111111111111111111111011
几点注意:
1、如果是byte、short、char类型进行移位操作符,则先化为int类型,并且移位后得到的结果也是int类型。对于int型移位操作符右端的移动的位数的二进制表示中,只有低5位是有用的,因为低5位最大可以表示32,而int型最多移动32位。若是对long类型的数值进行移位操作符,那么最终得到的结果将是long类型。
2、如果对byte或short值进行移位操作,那么得到的结果是int类型,如果使用<<=或者>>=或者>>>=赋值操作,可能导致把int类型赋予byte或short类型,而导致截断发生精度损失,例如下面的示例程序
byte b = -1;
System.out.println(Integer.toBinaryString(b));
b >>>= 10; //这里相当于把移位后的int类型赋给了byte类型b,发生了截断
System.out.println(Integer.toBinaryString(b));
b = -1;
System.out.println(Integer.toBinaryString(b));
System.out.println(b >>> 10); //这里直接显示,不发生截断,所以结果正确
运行结果:
11111111111111111111111111111111
11111111111111111111111111111111
11111111111111111111111111111111
4194303
对于整形十进制数的左移操作相当于操作数乘以2的(移动的位数)次方,如,20<<2,也就等于20乘以2的2次方 = 80
对于整形十进制数的右移操作也就是操作数除以2的(移动的位数)次方,如,20>>2,也就等于20除以2的2次方 = 5,不能整除的情况下,就取结果的整数部分。