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

如何用C++ accumulate和自定义lambda将二进制数组转为整数?

用C++ accumulate将二进制数组转整数的实现方案

核心问题说明

std::accumulate的默认lambda参数只有累加值和当前元素,无法直接获取元素索引。要实现你需要的按索引计算2的幂次逻辑,有两种可行方案:


方案一:带状态的lambda捕获索引变量

通过捕获外部索引变量,在每次迭代中更新索引值,同时完成累加计算。注意必须补充accumulate的第三个参数(初始值),你原代码中遗漏了这个必填项。

优化前代码(用pow函数)

vector<int> arr = {1,0,1,0,1,1,1,0,1,0,0};
int idx = 0;
int num = accumulate(
    arr.begin(), arr.end(), 
    0,  // 初始值,必须传入
    [&idx](int a, int b)
    { 
        int res = a;
        if (b % 2 != 0) {  // 二进制数组可简化为if(b)
            res += pow(2, idx);
        }
        idx++;
        return res;
    }
);

优化后代码(用位运算替代pow,避免浮点精度问题)

pow是浮点函数,可能存在精度误差,用位运算1 << idx效率更高且更可靠:

vector<int> arr = {1,0,1,0,1,1,1,0,1,0,0};
int idx = 0;
int num = accumulate(
    arr.begin(), arr.end(), 
    0,
    [&idx](int a, int b)
    { 
        int res = a;
        if (b) {
            res += (1 << idx);
        }
        idx++;
        return res;
    }
);

方案二:直接遍历数组(更直观)

如果不想用带状态的lambda,直接循环遍历数组实现逻辑会更清晰:

vector<int> arr = {1,0,1,0,1,1,1,0,1,0,0};
int num = 0;
for (int i = 0; i < arr.size(); ++i) {
    if (arr[i]) {
        num += (1 << i);
    }
}

额外注意事项

  • 索引方向:上述代码默认数组第i个元素对应2^i(即第一个元素是最低位)。如果你的需求是数组第一个元素为最高位(比如{1,0,1}对应5而非1),需要将索引调整为arr.size() - 1 - i。
  • 溢出问题:若数组长度超过31(int为32位),需改用long long类型存储结果,避免溢出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 23:00:11