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

判断2的幂的算法为何非无限循环?循环终止位置解析

判断数字是否为2的幂的循环终止问题解答

问题背景

我正在编写一个判断给定数字是否为2的幂的算法,在网上找到一个通过不断将数字除以2实现的方案,该方案可行但我不理解原理。

给出的代码如下:

i = 32;

// keep dividing i if it is even
while (i % 2 == 0) {
  cout << i << " is the current val of i\n";
  cout << i%2 << " is current i mod 2\n*****\n";
  i = i / 2;

// check if n is a power of 2
if (i == 1) {
  cout << n << " is a power of 2";
}

(注:原代码存在语法问题,while循环和if语句均未闭合大括号,但不影响核心逻辑的理解)

运行输出为:

32 is the current val of i
0 is current i mod 2
*****
16 is the current val of i
0 is current i mod 2
*****
8 is the current val of i
0 is current i mod 2
*****
4 is the current val of i
0 is current i mod 2
*****
2 is the current val of i
0 is current i mod 2
*****
32 is a power of 2

我的疑问是:为何这不是无限循环?循环在哪里终止?难道i % 2 == 0的结果永远为0吗?


解答

这个循环不会无限运行,核心原因是当i被除到1时,1 % 2的结果是1,不再满足i % 2 == 0的循环条件,循环直接终止。

我们一步步拆解i的变化过程:

  • 初始值i=32(是2的5次方),是偶数,进入循环,执行除法后i=16
  • i=16是偶数,进入循环,除法后i=8
  • i=8是偶数,进入循环,除法后i=4
  • i=4是偶数,进入循环,除法后i=2
  • i=2是偶数,进入循环,除法后i=1
  • 下一次循环检查时,i=1,1%2=1,不满足i%2==0的条件,循环直接退出

你看到输出里最后一行的32 is a power of 2,是因为当i变成1时,触发了代码里的if(i==1)判断,打印了这句话。

另外需要注意:原代码存在明显的语法错误,while循环和if语句都缺少闭合的大括号,实际运行时可能是编译器自动补全或者代码片段省略了部分内容,但核心逻辑是通顺的。


内容的提问来源于stack exchange,提问作者Mr Chasi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 10:01:14