Java:查找数字是否为2的幂

时间:2014-02-25 21:44:39

标签: java

找到解决方案:

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)在这里是什么意思?

2 个答案:

答案 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

这是对你的问题的一个非常好的解释。单个&符号&是一个按位和操作。有关详细信息,请参阅链接