bitset::to_string()可直接转高位在前的二进制字符串;手动遍历支持反向、分隔符和字符替换;转十六进制需依位数选择to_ulong()/to_ullong()或4位切片查表。

bitset::to_string() 是最直接的转换方式
只要 bitset 的模板参数是编译期确定的(比如 bitset、bitset),就能直接调用 to_string() 得到一个 std::string,内容是高位在前的二进制字符序列。
- 返回字符串中,索引 0 对应最高位(即
b[ N-1 ]),符合直观阅读习惯 - 不能传参,不支持自定义 0/1 字符(比如想用 '.' 和 'X' 代替就得自己遍历)
- 如果 bitset 长度很大(如
bitset),to_string()会一次性分配完整内存,无渐进式优化
std::bitset<4> b("1010");
std::string s = b.to_string(); // s == "1010"手动遍历 + append 是唯一可控的替代方案
当需要反向顺序(低位在前)、插入分隔符、或替换字符时,必须放弃 to_string(),改用循环读取每位。
- 用
b[i]取第 i 位(i=0 是最低位),注意和to_string()的顺序相反 - 推荐从高位开始遍历(
i = b.size()-1到0),避免最后 reverse - 用
std::string::reserve(b.size())预分配空间,防止多次扩容
std::bitset<6> b(0b110011);
std::string s; s.reserve(b.size());
for (int i = b.size()-1; i >= 0; --i) {
s += b[i] ? '1' : '0';
}
// s == "110011"转成十六进制字符串需先转 unsigned long / ull
bitset 提供 to_ulong() 和 to_ullong(),但仅当位数 ≤ sizeof(unsigned long) * 8 或 ≤ 64 时安全;超出会抛 std::overflow_error。
- 32 位以下:用
to_ulong()+std::hex流即可 - 超过 64 位:无法直接转整型,得按每 4 位切片,查表拼接 hex 字符串
- 注意:
to_ulong()返回值是数值,不是字符串;高位零会被自动省略(如bitset("00001010").to_ulong()得 10,不是 "0A")
std::bitset<8> b("00001010");
std::ostringstream oss;
oss << std::hex << std::setw(2) << std::setfill('0') << b.to_ulong();
std::string hex = oss.str(); // "0a"常见错误:误用 to_string() 处理运行时长度
std::bitset 的大小必须是编译期常量,不存在 “运行时决定长度的 bitset” —— 所以你不会遇到 bitset 中 N 是变量的情况。如果真有动态需求,得换用 std::vector 或 boost::dynamic_bitset,它们没有 to_string() 成员函数。
立即学习“C++免费学习笔记(深入)”;
- 写
int n = 8; std::bitset是非法 C++,编译失败b; - 试图对
vector调用to_string()会报错:no member named 'to_string' - 若用
dynamic_bitset,得手写循环或调用其to_string()(注意它默认低位在前,和标准 bitset 相反)
真正容易被忽略的是:to_string() 返回的字符串长度恒等于 bitset 模板参数,哪怕所有位都是 0 —— 它不会截断前导零。如果你要“紧凑二进制表示”,必须自己跳过开头的 '0',但要注意全零时至少保留一个 '0'。









