C++ bitset如何转string C++二进制位图转字符串输出方法【转换】

11次阅读

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

C++ bitset如何转string C++二进制位图转字符串输出方法【转换】

bitset::to_string() 是最直接的转换方式

只要 bitset 的模板参数是编译期确定的(比如 bitsetbitset),就能直接调用 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()-10),避免最后 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” —— 所以你不会遇到 bitsetN 是变量的情况。如果真有动态需求,得换用 std::vectorboost::dynamic_bitset,它们没有 to_string() 成员函数

立即学习C++免费学习笔记(深入)”;

  • int n = 8; std::bitset b; 是非法 c++,编译失败
  • 试图对 vector 调用 to_string() 会报错:no member named 'to_string'
  • 若用 dynamic_bitset,得手写循环或调用其 to_string()(注意它默认低位在前,和标准 bitset 相反)

真正容易被忽略的是:to_string() 返回的字符串长度恒等于 bitset 模板参数,哪怕所有位都是 0 —— 它不会截断前导零。如果你要“紧凑二进制表示”,必须自己跳过开头的 '0',但要注意全零时至少保留一个 '0'。

text=ZqhQzanResources