Java基础总结——移位

来源:互联网 发布:h5制作软件 编辑:程序博客网 时间:2024/06/05 15:37
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取余。因此,使用任何移位操作符和移位长度,都不可能将一个数值的所有位全部移走。

0 0