C++ 怎么实现各种进制转换 C++ bitset与stringstream转换【工具】
技术百科
裘德小鎮的故事
发布时间:2026-01-25
浏览: 次 std::bitset仅支持固定位宽二进制与整数互转:构造需指定模板参数,超长截断不报错;转十进制可能溢出抛异常;负数按补码解释;十六进制/八进制推荐用stringstream配合流操纵符。
用 std::bitset 做二进制 ↔ 十进制互转要注意位宽
std::bitset 不是通用进制转换工具,它本质是固定长度的二进制位容器。想把一个整数转成二进制字符串,得先知道最大位宽:
- 转二进制:必须指定模板参数,比如
std::bitset(123);若原数超长(如 123 对应bitset就溢出),高位直接截断,不报错也不警告 - 转十进制:调用
.to_ulong()或.to_ullong(),但若位模式超出目标整型范围(如 33 位全 1 转unsigned long),会抛std::overflow_error - 不能直接处理负数:构造时传入负整数,会按补码解释为大正数(
bitset(-1)得到11111111),不是符号位扩展逻辑
用 std::stringstream + std::hex/std::oct 转十六进制、八进制
这是最常用也最安全的整数 ↔ 其他进制字符串方案,依赖流操纵符控制输出格式:
- 十进制 → 十六进制:
ss 得到"ff"(小写),加std::uppercase变"FF" - 十进制 → 八进制:
ss 得到"100" - 注意:默认不补前导零,也不带
0x前缀;要加前缀得手动写"0x" + ss.str() - 反过来(字符串 → 整数)不能靠
stringstream自动识别进制前缀;必须用std::stoi(s, nullptr, base),其中base=0才支持"0x"和"0"前缀自动推断
二进制字符串 ↔ 整数:别硬套 bitset,优先用 std::stoul(..., nullptr, 2)
如果输入是运行时得到的二进制字符串(如 "10101"),std::bitset 反而麻烦——你得先算长度再写模板参数,还不能处理可变长或带空格/前缀的输入:
- 直接用
std::stoul("10101", nullptr, 2),返回21,简洁且支持任意长度(只要在unsigned long范围内) - 若字符串可能非法(含非
'0'/'1'字符),stoul会抛std::invalid_argument;建议包在try/catch里 - 十六进制字符串同理:
std::stoul("1aF", nullptr, 16)→431;八进制:std::stoul("755", nullptr, 8) -
bitset的
bitset(const std::string&)构造函数虽能接受二进制字符串,但要求严格:只含'0'和'1',且长度必须匹配模板参数,否则编译失败或运行时报std::invalid_argument
性能与边界:大数、前导零、跨平台兼容性
实际项目中容易忽略三点:
- 进制转换函数(如
stoul)在不同标准库实现中对超长字符串处理不一致;GCC libstdc++ 和 Clang libc++ 都支持远超 64 位的字符串,但 Windows MSVC 的_stoul可能早截断——关键逻辑别依赖“理论上支持” - 需要保留前导零时(如显示 8 位二进制
"00001010"),bitset天然支持(bitset(10).to_string()),而stoul → stringstream流程需手动std::setw(8) -
stringstream默认 locale 是 C,但如果全局 locale 被改过(如设成中文),std::hex等操纵符可能失效;稳妥做法是显式绑定ss.imbue(std::locale::classic())
std::stoul/std::stoull 配合 std::stringstream 是主力;std::bitset 只适合位宽确定、强调二进制语义(比如寄存器模拟、位操作掩码)的场景。别让它干解析字符串的活。
# 这是
# 也不
# 让它
# 三点
# 要注意
# 自动识别
# 工具
# c++
# stream
# 字符串
# 报错
# 整型
# 想把
# 零时
# 位宽
# overflow
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- 如何解决同一段404代码在不同主机上表现不一致的问
- Win11如何隐藏桌面图标 Win11一键隐藏/显
- Win11怎么设置虚拟桌面 Win11新建多桌面切
- c++怎么实现大文件的分块读写_c++ 文件指针s
- 如何解决Windows字体显示模糊的问题?(Cle
- 如何在Golang中实现邮件发送功能_Golang
- Windows 11如何查看系统激活密钥_Wind
- Windows 10怎么隐藏特定更新补丁_Wind
- Win10系统怎么查看网络连接状态_Windows
- 如何在Golang中捕获JSON序列化错误_Gol
- Win11怎么关闭防火墙通知_屏蔽Win11安全中
- Win11怎么更改电脑名称_Windows 11修
- Go 中的 := 运算符:类型推导机制与使用边界详
- XML的“混合内容”是什么 怎么用DTD或XSD定
- Win10如何更改电脑休眠时间_Windows10
- 如何在 Go 项目开发中正确处理本地包导入与远程模
- Mac如何修改Hosts文件?(本地开发与屏蔽网站
- Win11怎么关闭自动更新 Win11永久关闭系统
- Python对象比较与排序_集合使用说明【指导】
- Win11怎么关闭贴靠布局_Win11禁用窗口最大
- 如何使用Golang实现Web表单数据绑定_自动映
- Win11声音太小怎么办_Windows 11开启
- Windows如何使用注册表查找和删除项?(reg
- Win11局域网共享怎么设置 Win11文件夹网络
- 电脑的“网络和共享中心”去哪了_Windows 1
- 如何使用Golang模拟请求超时_Golang c
- 如何使用Golang defer优化性能_减少不必
- 如何使用Golang实现错误包装与传递_Golan
- Windows10怎么备份注册表_Windows1
- Win11任务栏怎么调到左边_Win11开始菜单居
- C++中的协变与逆变是什么?C++函数指针与返回类
- Win11怎样安装网易云音乐_Win11安装网易云
- Drupal 中 HTML 链接被重复转义导致渲染
- php怎么下载安装后设置错误日志_phpini l
- php485返回数据不完整怎么办_php485数据
- Win11怎么查看电脑配置_Win11硬件配置详细
- 为什么Go需要go mod文件_Go go mod
- php485函数怎么捕获异常_php485错误处理
- php订单日志怎么记录评价_php记录订单评价日志
- 如何使用Golang template生成文本模板
- PythonGIL机制理解_多线程限制解析【教程】
- Mac怎么设置登录项_Mac管理开机自启动程序【教
- c# 服务器GC和工作站GC的区别和设置
- Win11怎么格式化U盘_Win11系统U盘格式化
- Windows10系统怎么查看系统版本_Win10
- Win10系统更新错误0x80240034怎么办
- Win11怎么更改鼠标指针_Windows 11自
- 如何使用Golang搭建Web开发环境_快速启动H
- Go 语言标准库为何不提供泛型 Contains
- Win11任务栏颜色怎么改_Win11自定义任务栏


QQ客服