PHP中不使用*和/实现乘法:埃塞俄比亚乘法右移问题求助
埃塞俄比亚乘法代码修复方案
核心问题分析
你的代码存在三个关键问题导致$num2无法正常右移、逻辑失效:
- 移位操作未赋值回原变量:PHP中
<<和>>运算不会直接修改原始变量,必须将运算结果重新赋值给变量,否则$num1、$num2的数值永远不会变化,循环无法推进。 - 条件判断误用赋值运算符:
if ($num4 = $num1)是赋值操作而非比较判断,且这段逻辑完全不符合埃塞俄比亚乘法的规则。 - 循环逻辑不完整:埃塞俄比亚乘法需要处理到$num2变为0为止,且当$num2为奇数时需累加当前$num1,你当前的循环终止条件和判断逻辑都缺失了关键步骤。
修复后的代码
function ethMul($num1, $num2){ $count = 0; while($num2 > 0){ // 判断num2是否为奇数,是则累加当前num1到结果 if ($num2 & 1) { // 位运算判断奇偶,替代%2,符合无乘除要求 $count += $num1; } // 移位结果必须赋值回原变量,才会更新数值 $num1 = $num1 << 1; $num2 = $num2 >> 1; $num2 = (int) $num2; // 确保整数类型,避免小数干扰 } return $count; } echo ethMul(17, 12); // 输出204,对应17*12的正确结果
修复说明
- 修正移位赋值:将
$num1 << 1改为$num1 = $num1 << 1,$num2同理,确保变量真正被更新。 - 简化奇偶判断:用
$num2 & 1位运算判断奇偶(结果为1表示奇数),完全符合无乘除的要求,逻辑更高效。 - 完善循环逻辑:循环条件改为
$num2 > 0,确保所有位数都被处理,每次循环直接判断当前$num2的奇偶性,累加对应$num1,完全贴合埃塞俄比亚乘法的核心规则。
内容的提问来源于stack exchange,提问作者GalacticLux
相关产品推荐
相关产品推荐

