什么是表达式的含义while(n& 3)== 0和n>> = 2

时间:2015-09-26 12:05:28

标签: java

我发现这些表达式while(n&3)==0n>>=2感到困惑。我不确定这个条件何时执行while((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;  
}  

3 个答案:

答案 0 :(得分:5)

&是二元AND运算符。 3在二进制中的表示形式为0000..0011。因此,条件

(n & 3) == 0
true的最后两位都设置为零时,

n。如n % 4 == 0评论所示,当数字可被4整除时会发生这种情况。

同样,(n & 7) == 7表示“n的最后三位都设置为1”,因为7的二进制表示为000..00111。同样,这相当于除以8后剩下的7,因此n% 8 == 7评论。

执行n>>=2时,将数字向右移动两位,带符号扩展名。在你的上下文中,它相当于除以4,因为只要n不再被4整除,循环就会停止。

答案 1 :(得分:3)

  • (n & 3) == 0是一种过于复杂的说法&#34; n是4&#34;的倍数。
  • n>>=2是一种过于复杂的说法,将n除以4,向下舍入到下一个最低整数&#34;。

所以这个循环意味着&#34;继续将n除以4,直到它不再是4&#34;的倍数。

答案 2 :(得分:0)

  

&是按位AND

AND的情况下,按位运算符对位进行处理只有当两个操作数都为1时才返回1,否则为零。

假设在你的情况下n = 4

n & 3 100 & 011000给你0

  

>> bitshift运算符

n >> 2100 >> 2给你0011

将每一位向右移动2次。

您可以在Docs

中了解更多信息