找到解决方案:
private static boolean isPowerOfTwo(int number) {
if(number <=0){
throw new IllegalArgumentException(number + " is too small.");
}
if ((number & -number) == number) {
return true;
}
return false;
}
但无法理解if语句之一。
if ((number & -number) == number)
在这里是什么意思?
答案 0 :(得分:1)
&amp;是一个按位AND运算符。您需要知道一些二进制数才能知道该函数的工作原理。
负数用two's complement表示法表示,其中最左边的位用于表示数字是正数(如果为0)还是负数(如果为1)。
如果数字由二进制数字序列表示,则数字为2的幂,对于除1之外的所有数字,其值为0。例如,2 ^ 6 = 64由0100 0000
表示通过应用按位NOT运算符计算相应的负数(即将所有0更改为1,将所有1更改为0),然后在结果中添加1 - 在我们的示例中:
0100 0000 becomes 1011 1111 + 1 = 1100 0000
如果排列2个二进制数:
0100 0000
1100 0000
并应用按位AND,结果数字是原始数字64:
0100 0000
这解释了为什么number & -number == number
用于确定数字是否为2的幂。
为了证明这一点,让我们尝试使用其他数字而不是2的幂:
0100 0001 (65)
1011 1111 (-65)
---------
0000 0001 (1)
0000 0011 (3)
1111 1101 (-3)
---------
0000 0001 (1)
答案 1 :(得分:0)
Find if a number is a power of two without math function or log function
这是对你的问题的一个非常好的解释。单个&符号&
是一个按位和操作。有关详细信息,请参阅链接