【问题标题】:Why does my implementation of (Leetcode #231) Power of Two give the wrong result?为什么我的 (Leetcode #231) Power of Two 的实现会给出错误的结果?
【发布时间】:2019-11-15 06:14:28
【问题描述】:

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

我的思路是,如果最低有效位与 1 与等于 0(我正在尝试位掩码并且只对 n 的 LSB 执行 AND 操作),那么 n 有可能成为2. 所以我将 n 向右移动一位,并评估 n 是否为 1(那么是的,它是 2 的幂,并返回 true 给函数)。如果 n 不是 1,并且与 1 相与的 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;
}

【问题讨论】:

  • 或者你可以简单地使用:return n > 0 && (n & (n-1)) == 0;
  • 或者对于 unsigned 值只是 return v && !(v & (v - 1));

标签: c bit-manipulation


【解决方案1】:

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

解决方法是使用(n & 1) == 0

【讨论】:

    猜你喜欢
    • 2011-09-11
    • 2012-12-06
    • 2018-07-04
    • 1970-01-01
    • 2018-01-28
    • 2013-03-09
    • 2023-03-24
    • 1970-01-01
    • 2021-12-22
    相关资源
    最近更新 更多