【问题标题】:format binary literals with std::cout使用 std::cout 格式化二进制文字
【发布时间】:2016-01-06 10:41:55
【问题描述】:

以下代码会将数字的二进制输出写入控制台,如下所示:

00100000

#include <bitset>
using std::bitset;

#include <iostream>
using std::cout;
using std::endl;

int main()
{
    typedef const unsigned char byte;

    byte a = 0b00'000'000; // 0
    byte b = 0b00'000'001; // 1
    byte c = 0b00'000'010; // 2
    byte d = 0b00'000'100; // 4
    byte e = 0b00'001'000; // 8
    byte f = 0b00'010'000; // 16
    byte g = 0b00'100'000; // 32
    byte h = 0b01'000'000; // 64
    byte i = 0b10'000'000; // 128

    bitset<8> x = a | 1 << 5;

    cout << x << endl;
}

我希望输出是这样的:

00'100'000

有没有简单的方法来实现这一点?

【问题讨论】:

  • 也许您可以尝试为bitset 重载&lt;&lt; 运算符?
  • 为什么?在operator&lt;&lt; cout 中先行。它不同于bitset &lt;&lt; value
  • 我删除了我的评论。会尝试你的建议
  • 我建议使用命名函数而不是重载。 ADL 很有趣,直到它不起作用并且你必须找出原因。

标签: c++ console output


【解决方案1】:

这是解决方案之一:

template<size_t I>
std::ostream& operator << (std::ostream& os, const bitset<I>& b)
{
    int i;
    int check = b.size()-b.size()%3;

    for(i=b.size()-1; i >= check; --i)
        os << b[i];

    if(i>0)
        os << char(39);

    for(; i>=0; --i)
    {
        os << b[i];
        if(i%3 == 0 && i!=0)
            os << char(39);
    }
    return os;
}

【讨论】:

    【解决方案2】:

    使用这样的东西:

    std::ostream& operator<<(std::ostream & stream, std::bitset<8> bitset)
    {
        auto output_string = bitset.to_string();
    
        // here you format output_string as you want
    
        return stream << output_string;
    }  
    

    【讨论】:

    • 最好有template &lt;int N&gt; std::ostream&amp; operator&lt;&lt;(std::ostream &amp; stream, std::bitset&lt;N&gt; bitset) 这样它适用于任何bitset 大小。
    • @RedX 任何你想要的,你也可以模板化为 char 类型并覆盖 operator&lt;&lt;basic_ostream 等等,几乎无限 :-)
    猜你喜欢
    • 1970-01-01
    • 2011-11-13
    • 1970-01-01
    • 2020-05-01
    • 2011-08-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多