标准二进制模拟::d ec, 标准::十六进制, 标准::十月.
Binary analog of std::dec, std::hex, std::oct
我注意到,尽管标准库有I/O操纵器来打印十进制,十六进制或八进制形式的数字(std::dec
,std::hex
,std::oct
),但它没有二进制。
我将如何实现类似的二进制 I/O 操纵器?
反重复标记部分:我很失望我必须这样做,但我的问题几乎总是被标记为完全不同的和无用的问题的重复。 也许这将帮助人们远离虚假重复并找到真正的重复,如果它们确实存在的话。
- 我知道如何打印数字的二进制表示形式。 对于任何知道数字如何在计算机中存储的人来说,这是一项微不足道的任务,而不是这个问题的目的(即实现
std::string to_binary(T value)
、void print_binary(T value)
、...... - 我知道任何记住十六进制值的人都很容易在脑海中从十六进制转换为二进制。 但是,每当你引入人类工作时,你就会引入人类犯错误的能力。 如果可能的话,总是最好避免它。 我
- 意识到在扩展标准库方面有一些关于你可以做什么的规则,尽管我不太了解流和操纵器的内部工作原理,无法确切地知道在这种情况下允许什么。 我不是在寻找一个"你不能那样做"的答案 - 如果无法创建确切的模拟,那么给我你能想到的最干净的允许解决方案。
这是我到目前为止汇总的内容,它仍然有很多问题,我真的不明白发生了什么。 我刚刚复制并修改了菲尔链接的问题的解决方案。
#include <ios>
#include <iostream>
#include <locale>
int geti() {
static int i = std::ios_base::xalloc();
return i;
}
std::ostream& bin_manip(std::ostream& os) {
os.iword(geti()) = 1;
return os;
}
std::ostream& dec_manip(std::ostream& os) {
os.iword(geti()) = 0;
return os;
}
struct my_num_put : std::num_put<char> {
iter_type do_put(iter_type out, std::ios_base& str, char_type fill, long v) const {
bool binary_flag = str.iword(geti());
if (binary_flag) {
size_t width = 8 * sizeof(v);
for (size_t i = width - 1; i < width; --i) {
long bit = (((1 << i) & v) >> i) & 1;
out = std::num_put<char>::do_put(out, str, fill, bit);
}
return out;
}
else {
return std::num_put<char>::do_put(out, str, fill, v);
}
}
/*
iter_type do_put(iter_type s, std::ios_base& f, char_type fill, unsigned long v) const {
return std::num_put<char>::do_put(s, f, fill, v + f.iword(geti()));
}
*/
};
int main() {
std::cout.imbue(std::locale(std::locale(), new my_num_put)); // memory leak?
int v1 = 10;
long v2 = 11;
std::cout << bin_manip << v1 << std::endl << v2 << std::endl;
std::cout << dec_manip << v1 << std::endl << v2 << std::endl;
return 0;
}
输出如下:
0000000000000000000000000000000000000000000000000000000000001010
0000000000000000000000000000000000000000000000000000000000001011
10
11
我在这里看到的主要问题是处理各种类型时的代码重复。 照原样,我刚刚使用了do_put
函数,该函数采用long
类型的值,不幸的是,它打印出int
值比它们应该的要宽得多。 我尝试对函数进行模板化,它完全抵消了操纵器的效果,只是打印出10
和11
而不是它们的二进制表示。
另一个问题是,我不确定将每个1
和0
写入流的最佳方法是什么。 现在我把它们写成很长,这似乎有问题,我真的很想把它们写成单个字符。
最后,我不确定new
是否造成了内存泄漏,但 valgrind 告诉我它没有。
你可以参考这个 https://en.cppreference.com/w/cpp/io/manip/hex
// Note: there is no I/O manipulator that sets up a stream to print out // ` numbers in binary format (e.g. bin). If binary output is necessary // ` the std::bitset trick can be used: std::cout << "The number 42 in binary: " << std::bitset<8>{42} << std::endl; // output : The number 42 in binary: 00101010
相关文章:
- 如何在openssl-ecc中获取十六进制格式的私钥
- 如何将包含epoch时间的十六进制字符串转换为time_t
- 将字符指针十六进制转换为字符串并保存在文本文件C++中
- 如何将一个ostringstream十六进制字符串字符对转换为单个unit8t等价的二进制值
- 如何在C++中用std::cout正确显示带十六进制的字符串文本
- 通过错误处理,在C++中可靠地获得用户十六进制输入
- 为什么mpfr_printf与十六进制浮点(%a转换说明符)的printf不同
- 在 std::无符号字符的向量处存储 int 的十六进制表示形式
- 指向存储在字符串 c++ 中的十六进制
- 读取文件中所有可能的十六进制 16 字节序列并打印每个序列
- C ++如何使用UTF8十六进制代码打印UTF8符号?
- 如何将字节数组元素替换为修改的十六进制 ASCII 符号?
- 如何在C++中将十六进制字符串转换为文本数据
- 使用 sprintf 将十六进制0xAABBCC转换为字符串"AA:BB:CC"
- 绝对编码器十六进制输入
- 为什么C++总是显示十六进制内存地址,而不仅仅是整数?
- 标准二进制模拟::d ec, 标准::十六进制, 标准::十月.
- 使用十六进制值对标准::字符串进行编码
- 将 ASCII 标准::字符串转换为十六进制
- 如何从二进制标准的指针创建具有十六进制信息(作为char)的文件