有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

找到的解决方案如下:

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

  1. # 2 楼答案

    &;是位AND运算符。你需要知道一些二进制数才能知道这个函数是如何工作的

    负数用two's complement表示法表示,最左边的位用于指示该数字是正数(如果0)还是负数(如果1)

    如果一个数字是由一系列二进制数字表示的,那么这个数字是2的幂,除了一个数字外,其他数字的值都是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
    

    然后按位和,得到的数字是原始数字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)