为什么 std::setbase(2) 不切换到二进制输出?
Why doesn't std::setbase(2) switch to binary output?
std::setbase
上的cpp首选项页面说:
8、10 或 16 以外的基数值将基数字段重置为零,这对应于十进制输出和前缀相关输入。
怎么来了?
是否有特殊原因仅支持这些基础?至少支持最多 16 个(实际上,最多 36:0-9 然后是 a-z(而不必做出任何困难的选择似乎微不足道。具体来说,2 是一个流行的基础,我认为应该对std::setbase(2)
感兴趣(以及相应的std::binary
(。
我显然可以打印自己的位,但对我的 ostream 来说这样做会很好。
唯一确定的答案是"因为标准是这样说的"。
话虽如此,该标准主要形式化了预标准的iostream实现,其中许多可能只是为了达到与printf
的功能奇偶校验,后者仅支持十进制,八进制和十六进制(通过临时的,不是真正的通用语法(。
此外,就像现在一样,修补iostream API以支持"许多"碱基并不是一件容易的事,因为基设置最终会进入位域,而不是在单独的"当前碱基"字段中。
现在,该标准要求fmtflags
是某种"位掩码类型"——甚至可能是一个std::bitset
,所以你可能会找到一种方法来以某种方式铲除所有这些新的"基本"字段——但它真的值得为一个几乎没有人真正关心的功能付出努力(加上破坏假设fmtflags
是整体类型的代码的风险(吗?
所以,总结一下:糟糕的初始设计(实际上就像iostream的其余部分一样(,不平凡的修复以及没有真正的用户对这种功能的需求。
据我所知,没有提议向iostreams添加对二进制(基数2(格式的支持(另请参阅是否有将std::bin添加到c ++标准的提案?(。但是,它在 C++20 std::format
中受支持:
std::string s = std::format("{:b}", 42);
std::format
不是广泛使用的,但您可以使用 {fmt} 库,std::format
同时基于:
std::string s = fmt::format("{:b}", 42);
免责声明:我是 {fmt} 和 C++20 std::format
的作者。
- 二进制搜索不适用于特定输出
- 输入 1024 后十进制到二进制转换的输出错误?
- 读取二进制文件时如何输出?
- 编译器将输出的流运算符<<解释为用于按位左移的二进制运算符<<
- C++实现代码中的字符串不应存在于输出二进制文件中.如何解决
- qDebug - 如何以位(二进制格式)输出数据
- 在C 中输出到二进制文件中的麻烦
- 如何获取与 objdump 输出的标签相对应的 ELF 二进制文件中的文件偏移量
- 二进制搜索 - 代码编译并运行后不显示输出
- Z3 C++ API 产生"unknown",而序列化输出上的二进制生成"unsat"
- 具有特征类型输出的特征二进制 Expr
- 如何在 c++ 中使用二进制文件输入/输出读取/写入结构的字符串类型成员
- 我如何知道谷物二进制输出的大小?
- 二进制搜索树的输出不正确
- 二进制输出到C++中随机位置的文件
- 此项目不会将整数读取为二进制并将其作为二进制输出到新文件
- 为什么 std::setbase(2) 不切换到二进制输出?
- 在不截断的情况下打开二进制输出文件流
- 如何使用 g++ 生成确定性的二进制输出
- g++二进制输出分析