判断输入数值是否为2的幂的MATLAB函数返回值错误咨询
问题原因
你写的代码同时存在逻辑疏漏和边界情况未处理的问题,具体如下:
- 缺少输入合法性校验:2的幂必然是正整数,如果输入0、负数、非整数,你的代码要么进入死循环,要么返回错误结果
- 未处理输入为1的边界情况:1是2的0次幂,符合返回1的要求,但此时
while not(num == 1)的判断结果为假,整个循环不会执行,变量val完全没有被定义。如果你之前的工作区中存在残留的val=1变量,函数会直接调用该值,这就是你遇到始终返回1的核心原因 - 赋值逻辑有漏洞:只有进入循环后
val才会被赋值,若循环一次都未执行,返回值完全不可控
修复方案
版本1:基于原有逻辑修改
function val = func_1(num) % 先排除非正整数的非法输入 if num <= 0 || mod(num,1) ~= 0 val = 0; return end % 初始化返回值,默认num为1时直接返回1 val = 1; while num ~= 1 if mod(num,2) ~= 0 val = 0; break end num = num / 2; end end
版本2:位运算优化版(无需循环,效率更高)
2的幂的二进制表示有且仅有1个1,因此可以通过num & (num-1) == 0的规则快速判断,代码如下:
function val = func_1(num) % 逻辑值转double后true为1、false为0,正好符合返回值要求 val = double(num > 0 && mod(num,1) == 0 && bitand(num, num-1) == 0); end
内容的提问来源于stack exchange,提问作者Fitzgerald Brooks
相关产品推荐
相关产品推荐

