PHP:无前缀二进制字符串求和,避免bindec/decbin转换
二进制字符串求和的高效实现方案
我需要实现两个无前缀0b的二进制字符串求和,目前用bindec()转十进制相加再用decbin()转回二进制的方式不仅冗余,性能也不理想,希望找到不依赖这类转换函数的解决方案。
示例场景
输入:
$a = "11"; $b = "01";
期望调用echo binSum($a,$b);后输出100。
当前实现(需优化)
function binSum( $a, $b ) { return decbin(bindec($a) + bindec($b)); }
手动实现二进制加法的方案
直接模拟竖式二进制加法逻辑,逐位计算并处理进位,无需十进制转换:
function binSum($a, $b) { $maxLen = max(strlen($a), strlen($b)); // 补前导0,让两个字符串长度一致 $a = str_pad($a, $maxLen, '0', STR_PAD_LEFT); $b = str_pad($b, $maxLen, '0', STR_PAD_LEFT); $carry = 0; $result = ''; // 从右往左(最低位到最高位)逐位计算 for ($i = $maxLen - 1; $i >= 0; $i--) { $bitA = (int)$a[$i]; $bitB = (int)$b[$i]; $total = $bitA + $bitB + $carry; $currentBit = $total % 2; $carry = (int)($total / 2); // 当前位拼到结果头部 $result = $currentBit . $result; } // 处理最后剩余的进位 if ($carry) { $result = $carry . $result; } return $result; }
工作原理
- 先将两个二进制字符串补成相同长度,确保每一位能对应相加
- 从最低位开始遍历,计算当前位的和(包含前一位的进位)
- 当前位的值为总和对2取余,新的进位为总和除以2取整
- 把当前位拼到结果字符串的前面(因为是从低位往高位计算)
- 遍历结束后若还有进位,将其加到结果最前端
测试示例:执行binSum("11", "01")会返回100,完全符合预期。
内容的提问来源于stack exchange,提问作者Vivien Goncalves
相关产品推荐
相关产品推荐

