pneave icon

bitset

pneave | PRO | 11/22/17 10:49:09 PM UTC | 0 ⭐ | 353 👁️ | Never ⏰ | []
C++ |

2.88 KB

|

None

|

0 👍

/

0 👎

#include <iostream>
#include <bitset>
 
// The Object that we put on the stream.
// Pass in the group length, or default to 4.
class bitpr
{
  public:
    bitpr(size_t l = 4)
      :m_l(l){}
 
  private:
    // Class that actually does the work.
    class bitprn
    {
      public:
        bitprn(bitpr const& b, std::ostream& os)
          : m_l(b.m_l),
            m_s(os){}
 
        // The << operator for bitset<> types. Outputs the formatted
        // object to the stored stream then returns the stream.
        template<size_t N>
        std::ostream& operator<<(std::bitset<N> const& b)
        {
          int bit_len = b.size();
 
          for (int i = bit_len - 1; i >= 0; --i)
          {
            m_s << b[i];
            if ((i == (bit_len - bit_len % m_l)) ||
                (0 == i % m_l)) m_s << ' ';
          }
          return m_s << '\b';
        }
 
        // The << operator for all other types. Outputs the next object
        // to the stored stream then returns the stream.
        template<typename T>
        std::ostream& operator<<(T const& o)
        {
          return m_s << o;
        }
 
      private:
        size_t        m_l;
        std::ostream& m_s;
    };
    friend bitpr::bitprn operator<<(std::ostream& os, bitpr const& b);
 
  private:
    char m_l;
};
 
// When you pass an object of type bitpr to an ostream it returns
// an object of bitpr::bitprn that has overloaded the << operator for
// all types. This will process the next object and then return the stream
// to continue processing as normal.
bitpr::bitprn operator<<(std::ostream& os, bitpr const& b)
{
  return bitpr::bitprn(b, os);
}
 
using namespace std;
 
int main(int, char**)
{
  bitset<1> a;
  bitset<2> b;
  bitset<3> c;
  bitset<4> d;
  bitset<5> e;
  bitset<6> f;
  bitset<11> g;
  bitset<12> h;
  bitset<16> i;
  bitset<23> j;
 
  cout << "a: " << a << endl;
  cout << "b: " << b << endl;
  cout << "c: " << c << endl;
  cout << "d: " << d << endl;
  cout << "e: " << e << endl;
  cout << "f: " << f << endl;
  cout << "g: " << g << endl;
  cout << "h: " << h << endl;
  cout << "i: " << i << endl;
  cout << "j: " << j << endl;
 
  cout << "---------------------------------------\n";
 
  cout << "a: " << bitpr() << a << endl;
  cout << "b: " << bitpr() << b << endl;
  cout << "c: " << bitpr() << c << endl;
  cout << "d: " << bitpr() << d << endl;
  cout << "e: " << bitpr() << e << endl;
  cout << "f: " << bitpr() << f << endl;
  cout << "g: " << bitpr() << g << endl;
  cout << "h: " << bitpr() << h << endl;
  cout << "i: " << bitpr() << i << endl;
  cout << "j: " << bitpr(8) << j << endl;
 
  // Any other type is unchanged
  cout << "This is a string: " << bitpr() << "string" << endl;
  cout << "This is an int  : " << bitpr() << 123 << endl;
  cout << "This is a float : " << bitpr() << 3.14159 << endl;
 
  return 0;
}

Comments