为什么我的(Leetcode#231)二次幂的实现给出了错误的结果?

为什么我的(Leetcode#231)二次幂的实现给出了错误的结果?,c,bit-manipulation,C,Bit Manipulation,这个问题要求编写一个以整数作为输入的函数,如果整数是2的幂,则返回true。我想使用位AND运算符和逻辑移位来编写函数,以实践这些概念。我试图浏览许多输入示例,并认为我的代码可以正常工作,但当Leetcode使用“n=2”的测试用例时,我的代码返回false而不是true 我的思路是,如果最低有效位与1的and等于0(我试图对n的LSB执行位掩码和and操作),那么n有可能是2的幂。所以我将n向右移动一位,然后计算n是否为1(那么是的,它是2的幂,并返回true到函数)。如果n不是1,并且与1

这个问题要求编写一个以整数作为输入的函数,如果整数是2的幂,则返回true。我想使用位AND运算符和逻辑移位来编写函数,以实践这些概念。我试图浏览许多输入示例,并认为我的代码可以正常工作,但当Leetcode使用“n=2”的测试用例时,我的代码返回false而不是true

我的思路是,如果最低有效位与1的and等于0(我试图对n的LSB执行位掩码和and操作),那么n有可能是2的幂。所以我将n向右移动一位,然后计算n是否为1(那么是的,它是2的幂,并返回true到函数)。如果n不是1,并且与1 and的LSB不是0,那么这意味着n肯定不是2的幂-因此我中断while循环并返回false

谁能帮我找出哪里出了问题

bool isPowerOfTwo(int n){

    while(n>0)
    {
        if(n==1)
            return 1;

        else if(n&1 == 0)
            n = n>>1;

        else
            break;
    }
    return 0;
}

你的逻辑是正确的。不幸的是,您陷入了运算符优先级陷阱:
==
绑定比
&
更紧,因为
n&1==0
被解析为好像
n&(1==0)
自然总是0


修复方法是使用
(n&1)==0

,或者您可以简单地使用:
返回n>0&&(n&(n-1))==0
或对于
无符号
值,只需
返回v&!(v和(v-1))