2015-09-26 51 views
2

我發現與這些表達式while(n&3)==0n>>=2混淆。當執行while((n&3)==0)會發生什麼n>>=2當(n&3)== 0和n >> = 2時表達式的含義是什麼

public int numSquares(int n) { 
    while ((n & 3) == 0) //n % 4 == 0 
     n >>= 2; 
    if ((n & 7) == 7) return 4; //n% 8 == 7 

    if(is_square(n)) return 1; 
    int sqrt_n = (int) Math.sqrt(n); 
    for (int i = 1; i<= sqrt_n; i++){ 
     if (is_square(n-i*i)) return 2; 
    } 
    return 3;    
} 

public boolean is_square(int n){ 
    int temp = (int) Math.sqrt(n); 
    return temp * temp == n; 
} 

回答

5

&是一個二進制運算符這種情況下我不知道。 3在二進制中的表示形式是0000..0011。因此,條件

(n & 3) == 0 

true時的n最後兩個比特都被設置爲零。當數字可被4整除時,會發生這種情況,正如n % 4 == 0評論所建議的那樣。

同樣,(n & 7) == 7的意思是「n的最後三位都設置爲1」,因爲7的二進制表示是000..00111。再次,這相當於在除以8之後具有7的餘數,因此n% 8 == 7評論。

當您做n>>=2時,您將數字向右移兩位,並帶有符號擴展名。在你的上下文中,它相當於除以4,因爲循環在n不再能被4整除時停止。

+0

也許值得一提的是,N >>越= 2相當於除以4。 – RealSkeptic

+0

@RealSkeptic雖然對於正數,結果是相同的,對於負數它是不同的([demo](http://ideone.com/klxkbp))。這就是爲什麼我不願意提4分。 – dasblinkenlight

+0

我很好奇。有沒有使用按位&而不是餘數%運算符的優勢? – Amila

3
  • (n & 3) == 0是一種過於複雜的說「n是4的倍數」的方式。
  • n>>=2是一種過於複雜的說法,「將n除以4,向下舍入到下一個最小整數」。

所以這個循環的意思是「保持除n 4,直到它不再是4的倍數」。

+0

是的......因此,編寫代碼的人需要接受編寫清晰代碼的重要性,以及過早優化的弊端。 –

0

&是按位與

位運算符適用於位的AND情況下,它返回1只有兩個操作數爲1,否則爲零。你的情況

設N = 4,則

n & 3100 & 011會給你0000

>>位位移操作

n >> 2100 >> 2給你0011

將每個位向右移兩次。

你可以閱讀有關Docs

相關問題