You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++实现2的幂判断函数运行无输出无报错,返回布尔值无打印,求核查逻辑

代码缺陷排查与修正

原代码存在多段实现错误,直接导致程序运行卡死、无输出、判断逻辑失效,具体问题与修正方案如下:

  • 循环更新逻辑完全失效:原for循环的更新语句写为i << 1,这是无副作用的临时位运算计算,没有将计算结果赋值回循环变量i,导致i始终保持初始值1。只要入参n>1,循环就会陷入无限死循环,永远无法执行到return语句,也就不会走到main函数的打印逻辑,最终表现为程序运行后无任何输出。正确的循环更新写法是i <<= 1,完成左移后对i重新赋值。
  • 类型匹配缺陷:循环变量i定义为int类型,但函数接收的参数n是long long类型。当n的数值超过int类型表示范围(比如2^31及以上的大数值2的幂),int类型的i在移位过程中会发生整数溢出,触发未定义行为,哪怕修正了循环更新的bug,也会出现判断错误。循环变量i应定义为和n同类型的long long,避免溢出。
  • 缺少边界值判断:当n为0或负数时,本身就不可能是2的幂,需要提前做判断过滤,避免后续逻辑误判。

修正后的基础循环版本代码

#include <bits/stdc++.h>
using namespace std;

bool isPowerofTwo(long long n)
{
    // 提前排除非正数场景
    if (n <= 0) return false;
    for (long long i = 1; i <= n; i <<= 1)
    {
       if(i == n){
          return true;
       }
    }
    return false;
}

int main()
{
   // 配合boolalpha可让布尔值输出为true/false文本,默认会输出1/0代表真/假
   cout << boolalpha << isPowerofTwo(2) << endl;
   return 0;
}

效率优化的位运算实现

2的幂的二进制具备固定特征:有且仅有1个二进制位为1,其余位全为0。可以用位运算直接替代循环,将时间复杂度从O(logn)降低到O(1):

bool isPowerofTwo(long long n)
{
    // 数值为正,且与自身减1的按位与结果为0时,即为2的幂
    return n > 0 && (n & (n - 1)) == 0;
}

内容的提问来源于stack exchange,提问作者Rishav kumar dKcLpJMnPA

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.26 20:36:04