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

C++中超长二进制字符串转十进制字符串的更优实现咨询

超长二进制字符串转十进制字符串的高效实现

你的原代码存在几个问题:

  • 使用std::pow(2, i)会引入浮点数精度误差,当i较大时根本得不到正确的2的幂值
  • 字符串加法函数未处理进位逻辑,且循环索引越界(i = (int32_t)s1.size()会访问超出字符串长度的位置)
  • 逐个计算2^i再累加的方式效率极低,二进制字符串越长,性能下降越明显

更简单高效的实现思路是模拟手动进制转换的过程:从左到右遍历二进制字符串,每一步将当前的十进制结果乘以2,再加上当前二进制位的数值(0或1),全程用字符串维护十进制数,避免整数溢出。

具体实现代码

#include <string>
#include <algorithm>

std::string binary_to_decimal(const std::string& binary_str) {
    std::string decimal = "0";
    
    for (char c : binary_str) {
        // 第一步:将当前十进制数乘以2
        int carry = 0;
        for (auto it = decimal.rbegin(); it != decimal.rend(); ++it) {
            int digit = (*it - '0') * 2 + carry;
            *it = (digit % 10) + '0';
            carry = digit / 10;
        }
        if (carry > 0) {
            decimal.insert(decimal.begin(), carry + '0');
        }
        
        // 第二步:加上当前二进制位的数值
        if (c == '1') {
            carry = 1;
            for (auto it = decimal.rbegin(); it != decimal.rend() && carry; ++it) {
                int digit = (*it - '0') + carry;
                *it = (digit % 10) + '0';
                carry = digit / 10;
            }
            if (carry > 0) {
                decimal.insert(decimal.begin(), carry + '0');
            }
        }
    }
    
    // 处理二进制字符串全0的情况
    size_t first_non_zero = decimal.find_first_not_of('0');
    if (first_non_zero != std::string::npos) {
        return decimal.substr(first_non_zero);
    }
    return "0";
}

代码说明

  • 乘2操作:从十进制字符串的末尾(个位)开始遍历,每个数字乘以2并加上进位,更新当前位和进位,最后如果还有进位就插入到字符串头部。
  • 加当前二进制位:如果当前二进制位是'1',就给十进制字符串加1,同样从末尾开始处理进位。
  • 边界处理:如果输入的二进制字符串全是0,最终返回"0",避免返回一串0的情况。

这种方法的时间复杂度是O(n*m),其中n是二进制字符串的长度,m是最终十进制字符串的长度,相比你原代码的指数级复杂度,效率提升非常明显,逻辑也更清晰易懂。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 07:05:08