关于班次运营商

时间:2013-08-07 04:34:28

标签: java

public class Shift{

    public static void shift1(){
        int i = 0;
        while(-1 << i != 0){
            i++
        }
    }

    public void shift2(){
        for(int i=-1;i!=0;i<<=1){
            System.out.println(i);
        }
    }
}

第一种方法进入无限循环,其中第二种方法迭代31次变为0;为什么java在转移时只考虑右操作数的低位5位?

3 个答案:

答案 0 :(得分:5)

因为这是Java Language Specification中指定的内容:“如果左侧操作数的提升类型是int,则只使用右侧操作数的五个最低位作为移位距离。 “

许多硬件都是这样运作的。

答案 1 :(得分:2)

Java不会移动32或更多,因为它对int是一个相当无用的操作,只是因为它是如何指定工作的。

答案 2 :(得分:0)

“最低5位”无关。

-1表示为32“1”位:11111111111111111111111111111111

每个<< 1操作都会将这些位之一嚼掉,直到i为零 - 这就是控制迭代次数的原因。