Java基础总结——移位

Java中的移位包括如下三类:

  1. >>,右移符号位填充,负数高位填充1,正数填充0;
  2. >>>,常规右移,不管正数还是负数,都填充0;
  3. <<,左移,低位填充0.
由以上类型与赋值操作符结合,衍生出>>=,>>>=,<<=。
注意点:
  1. 都不能循环移位;
  2. 移位操作符只使用其右操作数的低5位作为移位长度。或者是低6位,如果其左操作数是一个long类数值。因此移位长度总是介于0到31之间;如果左操作数是long类型的,则介于0到63之间。这个长度是对32取余的,如果左操作数是long类型的,则对64取余。
public class Shifty {
    public static void main(String[] args) {
        int i = 0;
        while (-1 << i != 0)
            i++;
        System.out.println(i);
    }
}
例子来自于《Java谜题解惑》,代码不能打印任何信息,因为进入了无限循环。问题在于:(-1<<32)的结果为-1,因为32取余为0,相当于没有移位。


另外需要注意的是:负的移位长度通过只保留低5位而剔除其它位的方式被转换成了正的移位长度——如果左操作数是long类型的,则保留低6位。因此,如果要将一个int数值左移,其移位长度为-1,那么移位的效果是它被左移了31位。 


总之,移位长度是对32取余的,或者如果左操作数是long类型的,则对64取余。因此,使用任何移位操作符和移位长度,都不可能将一个数值的所有位全部移走。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值