c++ - 以固定长度打印二进制整数

标签 c++ binary bitset std-bitset

我重载了 <<打印自定义对象(在本例中为自定义类的实例 Vertex )。作为其中的一部分,我想以二进制形式打印给定的整数。出于多种原因,我更喜欢 std::bitset而不是运行 for 循环,但我遇到的问题是我有一个特定的大小,每个二进制文件应该取决于实例。这是片段:

std::ostream &
operator<< (std::ostream& os, const Vertex& V) {
    os << "(" << std::bitset<4>(V.signature()) << ") :";
    for (int e=2; e<V.degree(); ++e) {
        os << " [" << e << "]=" << V.neighbor(e) << " ";
    }
    return os;
}

代替 4 ,我真的很想放一个size_t这取决于 V .例如,这是我尝试过的:

std::ostream &
operator<< (std::ostream& os, const Vertex& V) {
    size_t B = V.degree()-1;
    os << "(" << std::bitset<B>(V.signature()) << ") :";
    for (int e=2; e<V.degree(); ++e) {
        os << " [" << e << "]=" << V.neighbor(e) << " ";
    }
    return os;
}

错误显示为“非类型模板参数不是常量表达式”。有没有办法在不对参数进行硬编码的情况下解决这个问题?这不是在编译时就会知道的东西。

最佳答案

一个简单的函数怎么样:

string bin_format(int_type value, size_t len);

然后您使用它写入流

out << bin_format(v.signature(), v.degree()-1);

超出此范围的任何内容都违反了 KISS 原则,需要仔细证明其合理性。例如。如果你设法经常重复 string 中的动态分配导致问题,您可以编写一个函数获取流和参数并将单个位写入流,或者您可以返回一个具有重载 operator<< 的代理。该运算符(operator)在哪里进行格式化和流式传输。顺便说一句,您还可以将该函数转换为基于整数类型的模板,这样您至少可以在所需的位数上设置最大值。

关于c++ - 以固定长度打印二进制整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29499616/

相关文章:

c++ - 如何反转位集中的位?

C++ make_shared 不可用

c++ - 反向链表导致循环

c - 使用 C 将二进制文件读入结构体,处理 char [8]

C++ - 生成具有可配置均值 "1s to 0s"比率的随机位集的有效方法

c++ - 将 `int*`转换为位集指针时会发生什么

c++ - 什么是最好的 "type renaming"方法?

c++ - 为什么不能将lambda用作非类型模板参数?

c++ - 当您只关心速度时如何存储二进制数据?

java - 初学者 Java Q on T 扩展了 Comparable T