您的位置:首页 > 编程语言 > Java开发

Java移位操作

2014-04-25 09:32 302 查看
移位操作符种类:

左移 << 
右移 >>
无符号右移 >>>
移位操作符的操作对象:二进制位,只能处理整数类型。
注: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,不能整除的情况下,就取结果的整数部分。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息