ASCII graphic waveform generator
The OOP design doesn't seem to be doing much for you.  It feels like you could get basically the same effect using just a function.  On the other hand, the operator&lt;&lt; method is basically a state machine, and it looks somewhat nastier than it needs to be.  There is copy-and-paste code, with bits of ASCII art all over the place, and a mini-Turing machine using the magic number 0x201.

Assuming that the to_bits() helper function isn't important to you (I assume it isn't that important, because you wrote #include &lt;bitset&gt; then changed your mind), you could do better by defining a filtering output stream.  Here's my attempt to implement such a thing:

#include &lt;climits&gt;
#include &lt;iostream&gt;
#include &lt;sstream&gt;
#include &lt;streambuf&gt;
#include &lt;string&gt;

class waveform_ostream : public std::streambuf
{
public:
    explicit waveform_ostream(std::ostream &amp;sink) : sink(sink) {}

protected:
    // Accept a byte of data
    virtual std::streambuf::int_type overflow(std::streambuf::int_type c) {
        output_bit(0, 'S');             // Start bit
        for (int i = 0; i &lt; CHAR_BIT; ++i) {
            output_bit((c &gt;&gt; i) &amp; 1);   // Data bits, LSB first
        }
        output_bit(1, 'P');             // Stop bit
        return c;
    }

    // Flush
    int sync() {
        for (int row = 0; row &lt; 4; ++row) {
            std::string s = lines[row]-&gt;str();
            sink &lt;&lt; s &lt;&lt; '\n';
            lines[row]-&gt;str("");
        }
        sink &lt;&lt; std::flush;
        return 0;   // success
    }

private:
    bool state = 1;
    std::ostream &amp;sink;
    std::stringstream level[2], risefall, captions;
    std::stringstream *const lines[4] = {
        &amp;level[1],
        &amp;risefall,
        &amp;level[0],
        &amp;captions
    };

    void output_bit(bool b, char caption='\0') {
        level[!b] &lt;&lt; ((b == state) ? "    " : "+   ");
        risefall  &lt;&lt; ((b == state) ? "    " : "|   ");
        level[ b] &lt;&lt;                          "+---";
        captions  &lt;&lt; "  " &lt;&lt; (char)(caption ? caption : b ? '1' : '0') &lt;&lt; ' ';
        state = b;
    }
};

int main()
{
    waveform_ostream wout(std::cout);
    std::ostream out(&amp;wout);
    out &lt;&lt; std::string("ST") &lt;&lt; std::flush;
}