2013-08-07 119 views
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位?關於移位運算符

回答

5

因爲這就是Java Language Specification中指定的內容:「如果左側操作數的升級類型爲int,則只有右側操作數的五個最低位用作移位距離。」

許多硬件也是如此。

+0

'java只考慮移位時右操作數的低位5位。我無法理解這意味着什麼。可以請幫忙。 –

0

「最低5位」不相關。

-1被表示爲32的「1」位:11111111111111111111111111111111

每個<< 1操作嚼了那些位中的一個,直到i是零 - 這是什麼控制迭代次數。

+1

* 32 *'1'位:「0xffffffff」。 – EJP

2

轉移32或更多不是由Java完成的,因爲這對於整數是一個相當無用的操作,並且僅僅是因爲它是如何指定工作的。