0

0

C++ 怎么实现各种进制转换 C++ bitset与stringstream转换技巧【工具】

尼克

尼克

发布时间:2026-02-01 15:43:07

|

657人浏览过

|

来源于php中文网

原创

C++进制转换优先用std::bitset处理固定位宽二进制、stringstream处理8/10/16进制字符串互转;bitset模板参数须编译期常量,调用to_string()获取字符串,自动高位补零。

c++ 怎么实现各种进制转换 c++ bitset与stringstream转换技巧【工具】

直接说结论:C++ 里进制转换别硬写循环,优先用 std::bitset 处理固定位宽的二进制,用 std::stringstream + std::hex/std::oct 做整数与字符串间的任意进制互转;但要注意 stringstream 不支持直接转任意进制(比如转 3 进制),bitset 只支持 2 进制且长度必须编译期确定。

std::bitset 转二进制字符串最稳

适合把一个整数(≤64 位)快速转成固定长度的二进制字符串,比如调试寄存器、生成掩码。

  • bitset 构造时传入整数,它会自动按补码截断填充,例如 std::bitset(255) 得到 "11111111"std::bitset(-1) 也是 "11111111"(因为 -1 补码就是全 1)
  • 不能传入运行时变量做模板参数:int n = 16; std::bitset(x) 是非法的 —— 模板参数必须是常量表达式
  • 想转成字符串?调用 .to_string(),不是 .c_str()(它没这个方法)
  • 注意高位补零:std::bitset(5)"0000000000000101",不需要手动 pad

std::stringstream 转 8/10/16 进制字符串

这是标准库最通用的整数 ↔ 字符串进制转换方式,但只内置支持八、十、十六进制。

  • 转字符串:设置流格式标志,例如
int x = 255;
std::stringstream ss;
ss << std::hex << x; // 小写十六进制 → "ff"
ss.str(); // 得到字符串
// 同理:std::oct → 八进制,std::dec → 十进制(默认)
  • 从字符串读整数:同样靠标志,但要确保字符串格式匹配,否则 failbit 被置位
  • ss >> std::hex >> y 会跳过前导空格,但不跳过 0x 前缀 —— 如果字符串带 "0xff",得先去掉前缀或用 std::stoi(str, nullptr, 16)
  • 大写十六进制?加 std::uppercasess → "FF"

转任意进制(如 3、7、36)只能手写

bitsetstringstream 都不支持。必须自己实现除基取余,尤其注意负数处理。

VidAU
VidAU

VidAU AI 是一款AI驱动的数字人视频创作平台,旨在简化视频内容创作流程

下载

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

  • 正数直接循环取余,倒序拼接;负数建议先转为无符号类型再算,避免右移符号扩展干扰
  • 基数 >10 时需映射数字到字符:0–9、a–z(最多到 36 进制),别忘了大小写控制
  • 常见坑:0 输入必须单独处理,否则循环不进,结果为空字符串
  • 示例逻辑:
std::string to_base(int n, int base) {
    if (n == 0) return "0";
    bool neg = n < 0;
    unsigned int un = neg ? -n : n; // 防止 INT_MIN 取负溢出,应改用 long long 或 uint64_t
    std::string res;
    while (un) {
        int r = un % base;
        res += (r < 10) ? '0' + r : 'a' + r - 10;
        un /= base;
    }
    if (neg) res += '-';
    std::reverse(res.begin(), res.end());
    return res;
}

性能与安全提醒

频繁转换时,stringstream 构造/析构开销比纯算法大;bitset 零拷贝但内存占用固定(如 bitset 占 128 字节)。

  • 不要在 tight loop 里反复创建 stringstream 对象,可复用并调用 ss.str("")ss.clear() 重置
  • std::stoi/std::stol 支持进制参数,比 stringstream 简洁,但异常处理更重(抛 std::invalid_argumentstd::out_of_range
  • 所有字符串转整数操作,都需检查是否转换完整:用 std::strtolendptrstringstream::eof(),否则 "123abc" 会被当成 123 静默接受

真正麻烦的从来不是“怎么转”,而是“边界怎么控”——负数、溢出、前缀、空格、不完整输入,这些地方一漏,线上就出隐蔽 bug。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1503

2023.10.24

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

361

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

212

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1503

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

625

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

676

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

630

2024.04.29

go语言字符串相关教程
go语言字符串相关教程

本专题整合了go语言字符串相关教程,阅读专题下面的文章了解更多详细内容。

173

2025.07.29

go语言 注释编码
go语言 注释编码

本专题整合了go语言注释、注释规范等等内容,阅读专题下面的文章了解更多详细内容。

30

2026.01.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 4.4万人学习

Pandas 教程
Pandas 教程

共15课时 | 1万人学习

ASP 教程
ASP 教程

共34课时 | 4.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号