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 andif(!(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:
modulobb
-
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