我发现这些表达式while(n&3)==0
和n>>=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;
}
答案 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 & 011
会000
给你0
>>
bitshift运算符
n >> 2
将100 >> 2
给你001
即1
将每一位向右移动2次。
您可以在Docs
中了解更多信息