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

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;
}

工作原理

  1. 先将两个二进制字符串补成相同长度,确保每一位能对应相加
  2. 从最低位开始遍历,计算当前位的和(包含前一位的进位)
  3. 当前位的值为总和对2取余,新的进位为总和除以2取整
  4. 把当前位拼到结果字符串的前面(因为是从低位往高位计算)
  5. 遍历结束后若还有进位,将其加到结果最前端

测试示例:执行binSum("11", "01")会返回100,完全符合预期。

内容的提问来源于stack exchange,提问作者Vivien Goncalves

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 04:57:17