2
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位?

4

3 回答 3

5

因为这是Java 语言规范中规定的:“如果左侧操作数的提升类型是 int,则只有右侧操作数的五个最低位用作移位距离。”

许多硬件也以这种方式工作。

于 2013-08-07T04:41:47.980 回答
2

Java 不会进行 32 位或更多的移位,因为它对 int 是一个相当无用的操作,而且仅仅是因为它被指定为这样工作。

于 2013-08-07T04:43:04.070 回答
0

“最低 5 位”不相关。

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

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

于 2013-08-07T04:42:54.350 回答