JAVA基础之移位操作

java中移位操作符操作的对象是二进制的位,并且只可以用来操作整数类型。

移位操作符有以下几种类型:

1、左移位操作符(<<):将操作数向左移动指定的位数,并在低位补0。

例如 int i = 10; 求 i << 5。首先将10表示为二进制1010(前面省略28个0),然后向左移动5位并在低位补5个0,就成了101000000(前面省略23个0)。

所以10<< 5 = 320(101000000的十进制表示)。

2、“有符号”右移位操作符(>>):将操作数向右移动指定的位数,若符号为正,则在高位插入0;若符号为负,则在高位插入1。

例如int i = 10; 求  i >> 2。首先将10表示为二进制1010(前面省略28个0),然后向右移动2位,最末尾的两位(10)就被舍去,因为10为正数,所以在最高位插入两个0,就成了10(前面省略30个0)。

所以 10>> 2 = 2(10的十进制表示)。

例如int i = -10;求 i >> 2。首先将-10表示为二进制11111111111111111111111111110110,然后向右移动2位,最末尾的两位(10)被舍去,因为-10为负数,所以在最高位插入两个1,就成了11111111111111111111111111111101。

所以-10>> 2 =  -3(上述结果的10进制表示)。

3、“无符号”右移位操作符(>>>):无论正负,都在高位插入0。

例如int i = -10; 求 i >>> 2。首先将-10表示为二进制11111111111111111111111111110110,然后向右移动2位,最末尾的两位(10)被舍去,在高位插入两个0,就成了00111111111111111111111111111101。

所以-10 >>> 2 = 1073741821(上述结果的10进制表示)。

PS:如果对char、byte或者short类型的数值进行移位处理,那么在移位之前,它们会被转换为int类型,并且得到的结果也是int类型。同时,int类型移位操作时,只有右操作数的低5位有用。即a<<b时,只用到了b的低5位。这是因为int类型的长度为32位,除去符号位,为了防止移位超过int型所具有的位数,所以最多移动31位,即b的低5位。

下面通过举例验证:

int i = 1;
i << 31 = 10000000000000000000000000000000;
i << 32 = 1;
i << 33 = 10;

在int移位操作中,对右操作数 31 取低5位后值仍为 31 ,因此 i 的值向左移动 31 位;右操作数 32 取低5位后值位 0 ,所以 i 的值不移位;右操作数 33 取低5位后为 1 ,所以 i 的值只移动 1 位。

同理若对long类型的数值进行移位处理,最后得到的结果也是long类型,此时只会用到右操作数的低6位。

当“移位”与“等号”组合使用时(<<=或>>=或>>>=),可能会遇到一个问题:如果对byte或short值进行这样的移位运算,得到的可能不是正确的结果。它们会先被转换成int类型,再进行移位操作,然后被截断,赋值给原来的类型。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值