判断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=8i=8是偶数,进入循环,除法后i=4i=4是偶数,进入循环,除法后i=2i=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
相关产品推荐
相关产品推荐

