Java移位操作

移位操作符种类:

  • 左移 << 
  • 右移 >>
  • 无符号右移 >>>
移位操作符的操作对象:二进制位,只能处理整数类型。
注: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,不能整除的情况下,就取结果的整数部分。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值