Bitset - Trennen der Ausgabe mit Leerzeichen?



  • hallo liebe Helfer 😉

    Ich soll ein Programm schreiben, welches (unter anderem) eine Zahl einliest, diese als Binärzahl ausgibt (16 Stellen) und die Ausgabe mit Leerzeichen trennt.

    quasi so: 0000 0000 0000 1010

    mit bitset is das ja kein problem...

    bitset<16> bs2( zahl );
    cout << bs2 << endl;
    

    ABER...

    Wie bekomm ich da die Leerzeichen rein? 😉



  • Es muss doch kein Bitset sein:

    unsigned short s = 0xF0F0;
    for(int i=15;i>=0;--i)
    {
    	cout << ((s>>i) & 1);
    	if(!(i%4))
    		cout << " ";
    }
    


  • Das beste wäre irgendeine Steuerung von std::cout.
    Aber so ists auch ganz elegant:

    namespace print_bitset_ {
      template <unsigned GroupLen, unsigned N>
      struct print_bitset {
        print_bitset(const std::bitset<N>& bs):bs(bs){}
        const std::bitset<N>& bs;
        friend std::ostream& operator<<(std::ostream& s, const print_bitset<GroupLen, N>& p)
        {
          for (int i=0; i<N; i++) {
            for (int j=0; j<GroupLen && i<N; j++,i++)
              s << p.bs[i];
            if (i<N) s << " ";
          }
          return s;
        }
      };
    }
    template <unsigned GroupLen, unsigned N>
    const print_bitset_::print_bitset<GroupLen, N> print_bitset(std::bitset<N>& x)
    {
      return print_bitset_::print_bitset<GroupLen, N>(x);
    }
    

    Gebrauch:

    std::cout << print_bitset<4>(x) << std::endl;
    


  • wir sind im programmieren noch relativ am anfang, deswegen kapier ich jetzt nicht so ganz, was das folgende bringt/macht...

    cout << ((s>>i) & 1);
        if(!(i%4))
      cout << " ";
    

    kannste das kurz erklären? 😉



  • cout << ((s>>i) & 1);
    ausgabe von: (s>>i &1)
    -> das i-te bit von s wird ausgegeben. (s wird um i stellen nach rechts geshiftet. und dann wird mit dem &1 nur das niedrigste bit ausgewertet. bsp.:

    s = 0100 1100
    
    i = 4
    (s>>i) = 0100
    &1
    = 0
    
    i = 3
    (s>>i) = 0 1001
    &1
    = 1
    

    siehe:
    bitshift, bitwise and

    if(!(i%4))
      cout << " ";
    

    wenn i ohne rest durch 4 teilbar ist, wird ein leerzeichen ausgegeben.
    i%4 ist ja der rest der division i/4.
    !(x) konvertiert x zu einem bool und prüft auf nicht wahr.
    es ist also das gleiche, wie:

    if((i%4) == 0)
      cout << " ";
    

    oder noch mehr aufgedrieselt:

    int rest_der_division_durch_4(i%4);
    bool durch_4_teilbar(rest_der_division_durch_4 == 0);
    if(durch_4_teilbar)
      cout << " ";
    

    siehe:
    modulo

    bb



  • M!ndLe$s schrieb:

    hallo liebe Helfer 😉

    Ich soll ein Programm schreiben, welches (unter anderem) eine Zahl einliest, diese als Binärzahl ausgibt (16 Stellen) und die Ausgabe mit Leerzeichen trennt.

    quasi so: 0000 0000 0000 1010

    mit bitset is das ja kein problem...

    bitset<16> bs2( zahl );
    cout << bs2 << endl;
    

    ABER...

    Wie bekomm ich da die Leerzeichen rein? 😉

    Die Lösung von unindented_ADL ist zwar die super C++ Lösung, aber für dich als Anfänger vermutlich etwas zu "hoch". Mach es dir ganz einfach und pack dein Ergebnis in nen std::string und gib es dann einfach formatiert aus. Aber versuche auch trotzdem die anderen Posts zu verstehen 😉


Anmelden zum Antworten