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位?
答案 0 :(得分:5)
因为这是Java Language Specification中指定的内容:“如果左侧操作数的提升类型是int,则只使用右侧操作数的五个最低位作为移位距离。 “
许多硬件都是这样运作的。
答案 1 :(得分:2)
Java不会移动32或更多,因为它对int是一个相当无用的操作,只是因为它是如何指定工作的。
答案 2 :(得分:0)
“最低5位”无关。
-1表示为32“1”位:11111111111111111111111111111111
每个<< 1
操作都会将这些位之一嚼掉,直到i
为零 - 这就是控制迭代次数的原因。