[Verständnisfrage zu Ausgabe einer Binärzahl als Dezimalzahl (vorliegender Code)
-
Gegebener Code lautet:
#include <iostream> using namespace std; int main() { char c = 0; int result = 0; cout << "Geben Sie eine binaere Zahl ein (z.B 1101): "; while (cin.get(c) && (c == '0' || c == '1' )) { result *=2; if ( c == '1') ++result; } cout << "\Der dezimale Wert der eingebenen Zahl lautet: " << result << endl; system("PAUSE"); return 0; }Ich will gar nicht wissen, was man daran besser machen könnte, sonern ihn nur verstehen.
Also wenn ich es richtig sehe, wird die eingegebene Zahl Schritt für Schritt in den Charakter c gelesen, richtig? Dabei wird wohl der zuletzt eingegebene Char zuerst eingelesen, richtig? Wieso genau ist das aber so, müsste er nciht zuerst den ersten einlesen, dann mit dem zweiten überschreiben, dann mit dem dritten, etc?
Eine weitere Frage ist, wieso er bei der eingabe von 0001 korrekterweise auch den Dezimalwert als 1 betitelt. Müsste er nicht bei der while schleife bei 0001 das result beim ersten einlesen um eins erhöhen (also result =1) und das dann wegen dem result *=2 mit 2 mulitplizieren und mir eine 2 Ausgeben?
Grüße
Matix
-
Ablauf bei 0001:
result = 0
Du gibst 0 ein: result = 0 * 2;
Du gibst 0 ein: result = 0 * 2 * 2;
Du gibst 0 ein: result = 0 * 2 * 2 * 2;
Du gibst 1 ein: result = 0 * 2 * 2 * 2 * 2 + 1;
result == 1;Ablauf bei 1001:
result = 0
Du gibst 1 ein: result = 0 * 2 + 1;
Du gibst 0 ein: result = (0 * 2 + 1) * 2;
Du gibst 0 ein: result = (0 * 2 + 1) * 2 * 2;
Du gibst 1 ein: result = (0 * 2 + 1) * 2 * 2 * 2 + 1;
result == 9;Noch unklar?
-
Ehrlich gesagt ist das noch verwirrender, zumal ich nun absolut nicht verstehe woher in dem Algorithmus die +1 herkommen soll Durch das preinkrementieren, oder wie?
Und heisst das nun das die Zahlen bzw c doch von links nach rechts eingelesen wird?
-
ThaRealMatix schrieb:
Ehrlich gesagt ist das noch verwirrender, zumal ich nun absolut nicht verstehe woher in dem Algorithmus die +1 herkommen soll Durch das preinkrementieren, oder wie?
Ja, denn da steht: Ist das aktuelle Zeichen eine '1', dann addiere eins auf result.
Und heisst das nun das die Zahlen bzw c doch von links nach rechts eingelesen wird?
Aus Streams wird immer das zuerst eingelesen, was zuerst da ist. Wenn Du "hallo" eintippst liest Du ja auch nicht "ollah".
-
Also wenn du 1001 eingibst, wird folgender Part
result *=2; if ( c == '1') ++result;erst mit 1 ausgeführt, dann mit 0, dann wieder mit 0 und dann mit 1. Und zwar jedesmal wenn du EINS von den Zeichen eingibst, nicht erst wenn du alle eingegeben hast. Das Programm blockiert bei get() und fährt erst fort, wenn IRGEND ein Zeichen eingegeben wurde.
-
mhm... sorry aber mir ist das immer noch nicht klar, wenn er es doch zeichen für zeichen macht, und result nur bei einer 1 hochgezählt wird, wie in Gottes namen kommt er dann zu
(0 * 2 + 1) * 2 * 2 * 2 + 1
Ich verstehs einfach nicht.
Ich würde es so verstehen das er bei
1001 folgendes hat
er liest ne eins, also result =1. Er liest ne 0 also bleibt result =1. Er liest wieder ne Null, also bleibt result weiterhin bei 1. Er liest ne eins, also wird result = 2.
Oder multipliziert er das result jedesmal hoch sobald es einmal 1 geworden ist weil das resulz *=2 dadrin ist und es ist beim ersten schleifen durchlauf nach der ersten eins ne 2, dann ne 4 und dann ne 8 usw?
Dann macht aber das incrementieren innerhalb der schleife für mich keinen Sinn?
-
result wird immer mit 2 multipliziert, da jedes Bit, was hinten drankommt (ganz rechts) die anderen Bits um eine Stelle nach links rutschen lässt.
-
Bei einer 1 oder 0 wird verdoppelt, richtig.
ZUSÄTZLICH wenn es eine 1 ist 1 hinzuaddiert.Meine erste Auflistung beinhaltet immer die vorherigen Schritte.
Also hast du entweder (bei einer 0) *2 oder (bei einer 1) *2+1.
-
Mhm... mit diesem 0*2 meinst du aber nicht das 0*2 gerechnet, sondern result mit 2 multipliziert wird während bei einer 1 result mit 2 mulitpliziert und 1 hinzuaddiert wird, korrekt?
Falls ja, wie kommt man denn bitte auf diesen Algorithmus, wenn der ursprüngliche eine 2er- Potenzierung darstellt.
Gibt es eigentlich irgendeinen Trick oder gute Üungen, mit denen man lernen kann (soclhe) Algorithmen zu entwickeln? Also zu lernen solche Probleme zu lesen und den passenden Algorithmus zu entwickeln und den dann umzusetzen? ich stolpere über soetwas nämlich sehr oft -.-
-
Du weißt schon, dass "result *= 2" <=> "result = result * 2", oder?
Was den Algorithmus angeht, ich habe irgendwann mal gelernt, wie Binärzahlen repräsentiert werden:
2^3 2^2 2^1 2^0 (entspricht) 8 4 2 1 (Binärzahl) 1 0 1 0 Dezimal: 8 + 0 + 2 + 0 = 10Weiters habe ich gelernt, dass "2 hoch 3" <=> "2 * 2 * 2".
In diesem Algorithmus (die Eingabe ist natürlich 1010) wird nun beim ersten eingegebenen Zeichen zuerst "result = 2" gerechnet. result ist noch 0, also ist das Ergebnis auch 0. Da c '1' ist wird result inkrementiert und ist damit 1. Das entspricht 2^0, wenn wir jetzt fertig wären, wäre das Ergebnis also 1. Im nächsten Durchlauf wird wieder mit 2 multipliziert, die 1 "rutscht" damit quasi von der Position 2^0 auf 2^1. Da c '0' ist wird nicht addiert. Wären wir jetzt fertig, wäre das Ergebnis 2 (1*2^1 + 0*2^0). Im dritten Durchlauf wird wieder multipliziert, die 1 rutscht von 2^1 auf 2^2 und die 0 von 2^0 auf 2^1. Da wir eine 1 eingegeben haben, wird addiert, damit steht an der Stelle 2^0 jetzt auch eine 1. Das Ergebnis ist jetzt 5 (1*2^2 + 0*2^1 + 12^0). Und nach dem letzten Durchlauf sind die Positionen 2^3 und 2^1 mit 1 besetzt, damit kommt als Ergebnis 10 raus.
-
LordJaxom schrieb:
Und heisst das nun das die Zahlen bzw c doch von links nach rechts eingelesen wird?
Aus Streams wird immer das zuerst eingelesen, was zuerst da ist. Wenn Du "hallo" eintippst liest Du ja auch nicht "ollah".
Ich muss zugeben, dass ich das Programm auch verwirrend finde. Ich bin es gewohnt die binäre Zahl von rechts nach links zu lesen. So wie in LordJaxom Eintrag beschrieben ist.
Hier wird allerdings das Ergebnis von links nach rechts berechnet, was bedeutet, dass die 2 hoch n Logik wohl nicht angewandt wird.
Rechne ich die binär Zahl wie von LordJaxom beschrieben (rechts nach links), komme ich bei 1010 auf 8 + 0 + 2 + 0 = 10.
Berechne ich die Zahl wie in dem Programm (links nach rechts), dann komme ich vereinfacht auf 1 + 1 + 3 + 5 = 10 oder genauer (0 * 2 + 1); (1 * 2 + 0); (2 * 2 + 1); (5 * 2 + 0) = 10.
-
Es ist insofern vielleicht verwirrend, weil das Ergebnis "wandert". D.h. die zuerst eingegebene Ziffer wird erst dann überhaupt zur 8 wenn man drei weitere Ziffern eingibt

Was die 2^n Logik angeht, die wird hier implizit natürlich auch angewandt, nur dass (in dem Fall) die 1 erst durch die drei folgenden Ziffern mit 2^3 multipliziert wird. Dazu schau Dir mal an, wie die 1 durch die Tabelle "wandert" im Verlauf der Schritte. Nach vier Durchläufen hast Du hier auch 2^3 - nur nicht in einem Schritt, sondern erst nach den nächsten drei Ziffern (wir erinnern uns: 2^3 <=> 2*2*2)