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

VS2013下解决C++编译期初始化2^16位std::bitset的字符串超限问题

大位宽固定常量std::bitset的编译期初始化经验

需求说明

我需要存储一个静态常量、长度为2¹⁶位的std::bitset,内部存放的0/1位序列完全固定,运行过程中不会修改。

初次尝试踩坑

我最初采用传入字符串字面量的编译期初始化方案,代码写法如下:

std::bitset<1<<16> myBitset("101100101000110 ... "); // 省略号位置替换为实际的65536位序列

但在VS2013编译器下,直接抛出了字符串过长的编译错误。

拆分字符串的二次尝试

我尝试把过长的字符串拆成多段短字符串,借助C++相邻字符串字面量自动拼接的特性改写代码:

std::bitset<1<<16> myBitset("100101 ..."
                            "011001 ..."
                            ...
                            );

但编译仍然报错,错误码为C1091:编译器限制:字符串长度超过65535字节。我算了下实际长度:手里的完整位串共65536字节,加上字符串末尾的EOS结束符,总长度是65537字节,刚好超出了该版本编译器的字符串字面量长度上限。
针对这个问题,想请教还有哪些可行的实现方案?

最终落地的实现

感谢用户luk32给出的移位按位或思路,我最终采用这种方式完成了初始化,写法可正常通过VS2013编译:

const std::bitset<1<<16> bs = (std::bitset<1<<16>("101011...")
    << 7* (1<<13)) | (std::bitset<1<<16>("110011...")
    << 6* (1<<13)) | (std::bitset<1<<16>("101111...")
    << 5* (1<<13)) | (std::bitset<1<<16>("110110...")
    << 4* (1<<13)) | (std::bitset<1<<16>("011011...")
    << 3* (1<<13)) | (std::bitset<1<<16>("111011...")
    << 2* (1<<13)) | (std::bitset<1<<16>("111001...")
    << 1* (1<<13)) | std::bitset<1<<16>("1100111...");

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.23 03:45:06