Wie kann ich short binär ausgeben?
-
Geh einfach jedes bit durch und geb aus ob es gesetzt ist oder nicht.
Die entsprechenden Werte entweder selber ausrechnen oder die 1 durchshiften. Auf die richtige Bitoperation wirst du hoffentlich selber kommen
-
nein, eigentlich komm ich nciht drauf!
HAb auch das mit dem union nicht verstanden
-
Bitoperation schrieb:
nein, eigentlich komm ich nciht drauf!
HAb auch das mit dem union nicht verstanden
Irgendwie so sollte es doch gehen...
short int x = 16; for (unsigned int i1 = 0; i1 < 15 /* (oder 14?) */; i1++) { cout << (x & 0x1); x = x << 1; }
... und dann die Ausgabe umdrehen
-
Klasse: also das mit den Bitoperationen versteh ich nicht so richtig..... =(!
Wäre auch über ein beispiel der anderen beiden möglichkeiten dankbar!
-
Natürlich in die richtige Richtung shiften!!!
[cpp]
short int x = 16;for (unsigned int i1 = 0; i1 < 15 /* (oder 14?) */; i1++) {
cout << (x & 0x1);
x = x >> 1;
}
[/cpp]... und dann die Ausgabe umdrehen[/quote]
-
Wenn du dir das "Ausgabe umdrehen" sparen willst
kannst du natürlich auch nach links shiften und mit 16tausenschlagmichtod (2^16-1) &'en
also
cout << (x & 16XXX);
x = x << 1;
-
Hmm... nicht eher sowas hier?
short x=10; int i; for(i=1;i<=x;i*=2); for(;i>0;i/=2) cout<<((x&i)>0);
EDIT: Verdammt... wie blöd, wenn man lange kein Standard-C++ gemacht hat ^^ Nach 4x Editieren sollte es so aber mal funzen...
-
#include <iostream> int main() { unsigned short num = 4242; const unsigned short short_bits = sizeof(unsigned short) * 8; unsigned short bit = 1 << short_bits-1; do { std::cout << ((num & bit) != 0); bit >>= 1; } while (bit != 0); std::cout << std::endl; }
-
Hmm... der Code ist mir zu lang... hier ist das, wie ich es gemacht hab und es läuft einwandfrei:
#include <cstdlib> #include <iostream> using namespace std; int main(int argc, char *argv[]) { int x=10385; int i; for(i=1;i<x;i*=2); for(;i>0;i/=2) cout<<((x&i)>0); cout<<endl; getchar(); return 0; }
-
Windoof schrieb:
for(i=1;i<x;i*=2);
Die ist wirklich übel. Wie wär's mit nem Kommentar, in der nächsten Zeile am besten?
-
finix schrieb:
const unsigned short short_bits = sizeof(unsigned short) * 8;
hätt' ich das geschrieben dann hätte mir jetzt einer erzählt man solle CHAR_BIT statt 8 verwenden
-
finix schrieb:
Die ist wirklich übel. Wie wär's mit nem Kommentar, in der nächsten Zeile am besten?
Häh?
-
finix schrieb:
Windoof schrieb:
for(i=1;i<x;i*=2);
Die ist wirklich übel. Wie wär's mit nem Kommentar, in der nächsten Zeile am besten?
bitte keinen kommentar.
-
net schrieb:
finix schrieb:
const unsigned short short_bits = sizeof(unsigned short) * 8;
hätt' ich das geschrieben dann hätte mir jetzt einer erzählt man solle CHAR_BIT statt 8 verwenden
Ok, dann die hier revidierte Fassung, inklusive <climits> und korrekter Terminologie:
#include <iostream> #include <climits> int main() { unsigned short num = 4242; const unsigned short short_bits = sizeof(unsigned short) * CHAR_BIT; unsigned short mask = 1 << short_bits-1; do { std::cout << ((num & mask) != 0); } while ((mask >>= 1) != 0); std::cout << std::endl; }
-
volkard schrieb:
bitte keinen kommentar.
Zum Code oder zur Erklärung?
-
finix schrieb:
const unsigned short short_bits = sizeof(unsigned short) * CHAR_BIT;
gibts dafür nicht traits? mach das mal modern.
-
volkard schrieb:
finix schrieb:
const unsigned short short_bits = sizeof(unsigned short) * CHAR_BIT;
gibts dafür nicht traits? mach das mal modern.
Ja, genau, du hast recht.
Am besten als template realisiert.
Mit Policy, führende Nullen ausgeben oder nicht.
Und Spezialfallbehandlung, min & max z.B.
Diese simple Übungsaufgabe gehört echt verkompliziert.
-
finix schrieb:
volkard schrieb:
finix schrieb:
const unsigned short short_bits = sizeof(unsigned short) * CHAR_BIT;
gibts dafür nicht traits? mach das mal modern.
Ja, genau, du hast recht.
Am besten als template realisiert.
Mit Policy, führende Nullen ausgeben oder nicht.
Und Spezialfallbehandlung, min & max z.B.
Diese simple Übungsaufgabe gehört echt verkompliziert.sorry, aber wer so grottenhäßlichen code schreibt wie du, der muss auch mal auf mich hören. schau, ob die numeric_limits benutzen kannst. und berichte am nesten nachher hier.
-
finix schrieb:
volkard schrieb:
bitte keinen kommentar.
Zum Code oder zur Erklärung?
den code nicht kommentieren.
sondern anders schreiben.for(i=1;i<x;i*=2) ;
oder
for(i=1;i<x;i*=2){ }
oder
for(i=1;i<x;i*=2) doNothing();
oder irgendwie halt, daß man das da sauber lesen kann. aber schmutzigen conde nicht kommentieren, statt zu reinigen.
-
volkard schrieb:
sorry, aber wer so grottenhäßlichen code schreibt wie du, der muss auch mal auf mich hören. schau, ob die numeric_limits benutzen kannst. und berichte am nesten nachher hier.
Oh, jetzt schreibe ich auch noch grottenhäßlichen Code oder was? Und hab noch nie was von numeric_limits gehört? Und das alles nur weil's dir nicht gefällt?
Irgendwie ging's doch eigentlich nur um eine Lösungsstrategie an sich für eine Anfängeraufgabe, oder? Mag sein dass du in diesem Fall recht hast und numeric_limits<unsigned short>::digits auch für Newbies selbsterklärend genug ist, oder es wenigstens sinnvoll genug wäre es schnell zu erklären.
volkard schrieb:
den code nicht kommentieren.
sondern anders schreiben.Ok, hätte ich vielleicht etwas ausführlicher kommentieren sollen. Hier meine Variante:
for (i=1;i<x;i*=2) ; // do nothing // oder speziell für diesen Fall: int i = 1; while (i<x) { i *= 2; }
volkard schrieb:
for(i=1;i<x;i*=2) ;
Naja, wenn's denn sein muss.
volkard schrieb:
for(i=1;i<x;i*=2){ }
Macht, finde ich zumindest, immer noch nicht unmittelbar deutlich was los ist.
volkard schrieb:
for(i=1;i<x;i*=2) doNothing();
Heute ist der 1.April, was?
Leere Methoden nicht zu kommentieren mag ja fast noch OK sein, aber leere Schleifenkörper müssen einfach kommentiert werden.
IMAO.