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
相关产品推荐
相关产品推荐

