贝利信息

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

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

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

只要 bitset 的模板参数是编译期确定的(比如 bitsetbitset),就能直接调用 to_string() 得到一个 std::string,内容是高位在前的二进制字符序列。

std::bitset<4> b("1010");
std::string s = b.to_string(); // s == "1010"

手动遍历 + append 是唯一可控的替代方案

当需要反向顺序(低位在前)、插入分隔符、或替换字符时,必须放弃 to_string(),改用循环读取每位。

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

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() 成员函数。

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