Java移位操作符使用初探

Java中移位操作符共有三种,分别是:左移操作符(<<),右移操作符(>>),无符号右移操作符( >>> ),看似简单,却不简单。

左移操作符(<<)能按照操作符右侧指定的位数,将操作符左边的操作数向左移动,在低位补0;

右移操作符(>>)能按照操作符左侧指定的位数,将操作符有变的操作数向右移动,若操作数为正,则高位补0。若操作数为负,则高位补1。

无符号右移操作符( >>> )无论操作数正负,都在高位补0.。这也是C和C++中没有的一种特殊操作符。

对于无符号右移操作符( >>> ),当操作数为byte和short型时,可能会出现错误,先看下面这个例子:

public class URShift {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int i=-1;
		System.out.println("int-->"+Integer.toBinaryString(i));
		i>>>=10;
		System.out.println("int-->"+Integer.toBinaryString(i));
		long l=-1;
		System.out.println("long-->"+Long.toBinaryString(l));
		l>>>=10;
		System.out.println("long-->"+Long.toBinaryString(l));
		short s=-1;
		System.out.println("short-->"+Integer.toBinaryString(s));
		s>>>=10;
		System.out.println("short-->"+Integer.toBinaryString(s));
		byte b=-1;
		System.out.println("byte-->"+Integer.toBinaryString(b));
		b>>>=10;
		System.out.println("byte-->"+Integer.toBinaryString(b));
		//以下为byte正确输出
		b=-1;
		System.out.println("byte-->"+Integer.toBinaryString(b));
		System.out.println("byte-->"+Integer.toBinaryString(b>>>10));
	}

}
输出结果:
int-->11111111111111111111111111111111
int-->1111111111111111111111
long-->1111111111111111111111111111111111111111111111111111111111111111
long-->111111111111111111111111111111111111111111111111111111
short-->11111111111111111111111111111111
short-->11111111111111111111111111111111
byte-->11111111111111111111111111111111
byte-->11111111111111111111111111111111
byte-->11111111111111111111111111111111
byte-->1111111111111111111111

本例中,int和long都得到了正确的移位并输出,而byte和short却出现了-1无符号右移仍为-1的错误结果,接下来分析下原因。

我们都知道,byte为8位长,short为16位长,int为32位长,long为64位长。对于byte和short两种类型,当">>>"与"="合用时,操作数会首先被转为int型,然后进行右移操作,最后从低位截断,赋值给byte或short型变量,可能造成错误结果。

对于byte=-1,对应二进制为:1111 1111

转为int,对应二进制为:1111 1111 1111 1111 1111 1111 1111 1111

右移10位,对应int型的二进制为:0000 0000 0011 1111 1111 1111 1111 1111

从低位截断,对应的byte型的二进制为:1111 1111

至此可发现数值未变化,仍为-1,结果错误!

对于short类型分析过程相同,因此,大家在使用无符号右移操作符( >>> )时,应留意此处,防止出现不易追踪的错误。

就到这里,再见吧!



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值