c++oding="utf-8" ?>
std::bitset是转整数为二进制字符串最轻量无bug的选择,但需注意:仅接受无符号整数、位宽须编译期常量、输出含前导零需手动截取;负数应先static_cast转无符号;std::to_chars不支持二进制;大数需字符串模拟除法。

用 std::bitset 快速转整数为二进制字符串
对确定位宽的整数(如 int、unsigned int),std::bitset 是最轻量且无 bug 的选择。它不依赖 I/O 流,不分配堆内存,编译期就确定大小。
常见错误是直接传入负数——std::bitset 构造函数只接受无符号整数,传 int 负值会做模运算转成大正数,结果不是你想要的补码形式。
- 用前先转成无符号类型:
std::bitset(static_cast<unsigned int>(n))</unsigned> - 位宽必须编译期常量,不能写
std::bitset<n></n>(n是变量) - 输出不含前导零?那就得手动截掉:
s.find_first_not_of('0'),注意全零时返回std::string::npos
int n = 12;
std::bitset b(static_cast<unsigned int>(n));
std::string bin = b.to_string(); // "00000000000000000000000000001100"
// 去前导零
size_t pos = bin.find_first_not_of('0');
std::string clean = (pos == std::string::npos) ? "0" : bin.substr(pos); // "1100"</unsigned>
手写除二取余法:控制格式和负数逻辑
当需要明确看到“除以 2 取余”过程、处理负数(比如按原码/补码自定义规则)、或输入超出 bitset 支持范围(如 long long 以上)时,就得自己循环。
关键点不是算法本身,而是余数顺序和符号处理。直接 push_back 每次余数,最后 reverse,否则得到的是逆序结果。
- 对负数,C++ 中
n % 2可能是 -1(取决于编译器),别直接用;统一用abs(n) % 2再单独加符号前缀 - 0 要特判,否则 while 循环不进,结果为空字符串
- 如果要补码表示,别在字符串层面拼接;应先转成对应位宽的无符号整型再用
bitset
std::string dec2bin(int n) {
if (n == 0) return "0";
bool neg = n (-static_cast<long long>(n)) : n;
std::string res;
while (u) {
res += '0' + (u & 1); // 比 u % 2 更快
u >>= 1;
}
std::reverse(res.begin(), res.end());
return neg ? "-" + res : res;
}</long>
std::to_chars 不支持二进制,别试
有人查到 std::to_chars 能高效转进制,但它的 base 参数只接受 2–36,实际实现里绝大多数标准库(libstdc++、libc++)**硬编码只支持 10 和 16**。传 2 会返回 std::errc::invalid_argument。
这不是文档疏漏,是标准未强制要求支持其他进制,厂商也没动力实现。别浪费时间调试这个。
- 实测 GCC 13 / Clang 17 下
std::to_chars(buf, buf+32, 42, 2)返回失败 - 想高性能?用
bitset或查表法(8-bit 分段转)更靠谱 - 需要动态位宽又不想手写循环?考虑 Boost.StringAlgo 或 fmt::format(但有依赖)
大数(超过 64 位)怎么办
标准整型最多 128 位(__int128 非标准),再大就得靠字符串或第三方库。此时“转换”本质是字符串模拟除法。
核心动作就一个:不断用字符串表示的十进制数除以 2,记录每次余数(0 或 1),直到商为 "0"。余数倒序即结果。
- 别用
std::stoi拆分——会溢出;得实现字符串版除 2 - 每次除 2 只需从高位开始扫一遍,维护余数传递,O(n) 时间
- 已有轮子?
boost::multiprecision::cpp_int的to_binary_string()可直接用,但引入 boost 是重量级选择
真正卡住的往往不是算法,而是忘了输入可能带符号、空格或前导零——预处理字符串比写除法还花时间。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











