Umwandlung von Dezimalzahl zu Binärzahl
-
wie kann ich bitte Dezimalzahlen zu Binärzahlen umwandeln und anschliessen in eine Array gespeichert werden muss
-
Was verstehst du unter Dezimalzahlen? Zahlen, die in einem String gespeichert sind? Dann würde ich stringstreams nehmen. Du must diesen String in einem std::string speichern. Dann kannst du mithilfe der Klasse stringstream aus diesem string auslesen, wie du es von cin kennst. Schau mal in der FAQ zum Thema stringstreams (ich hoffe da steht was...)
geloescht
-
wenn es um integers geht, dann teil die dezimalzahl einfach solange durch 2 bis 0 rauskommt. wenn der rest 1 ist, dann schreibst du eine 1 auf, wenn der rest 0 ist, schreibst du eine null auf. hast du das gemacht, dann hast du die binärzahl in UMGEKEHRTER reihenfolge!
dass man den rest einer division mittels '%', dem modulo-operator, überprüft, weißt du sicher schon...
ciao, cypoc
-
auch wenn ich ihm jetzt die arbyte abnehme
hier#include <iostream> #include <cmath> #include <cstring> using namespace std; int main(int argc, char *argv[]) { if(argc<2) { cout << "usage: <string to convert>" << argv[0]; return 0; } char *ascii= argv[1]; int len = strlen(ascii); int i,j; for(i=0;i<len;++i) { for(j=7;j>=0;--j) { if(ascii[i]>=pow(2,j)) { cout << "1"; ascii[i]-=pow(2,j); } else cout << "0"; } //Not needed but easier to understand this way //Prints space between 8-bit values cout << " " ; } return 0; }
-
so leute ich will das Prinzip von diese Aufgabe verstehen bitte
ich bin bei c++ neu
wie kann mann das einfache programmieren ohne FKT und ohne klassen .
die aufgabe lautet das mann ein Dezimalzahl eingit und um eine Binäerzahl verwandelt und anschliessen in array speichern
-
galilio12 schrieb:
wie kann mann das einfache programmieren ohne FKT
Was soll das heissen? Ohne Funktionen? Du bist dir aber schon klar was C++ bedeutet?
Raptor schrieb:
if(ascii[i]>=pow(2,j)) { cout << "1"; ascii[i]-=pow(2,j); }
Wieder einer der einfachste Algorithmen mit unbedachten Mitteln umsetzt. Naja, vielleicht gibts ja Compiler die das optimieren können. Dir ist offensichtlich nicht klar, dass pow(2,j) das gleiche Ergebnis liefert wie 1 << j. Letztere Variante ist für Prozessoren geradezu ein Witz im Vergleich zur ersten.
-
Eben, da er ja unbedingt die Binärdarstellung haben will, sollte er einfach die Bits einzeln auslesen... wo ist das Problem?
-
absolute_beginner schrieb:
Eben, da er ja unbedingt die Binärdarstellung haben will, sollte er einfach die Bits einzeln auslesen... wo ist das Problem?
Nein, das war mir allerdings nicht klar.
Ich habe noch keine Erfahrung mit den Shift-Operatoren.
-
Sieh mal hier: http://www.c-plusplus.net/forum/viewtopic.php?p=419197#419197
Mit den Shiftoperatoren verschiebst du die zahl um n stellen in eine richtung.
Beispiel:
110011 << 2 // das verschiebt die zahl um 2 stellen nach links
= 11001100 // es wurde also mit 0 aufgefüllt110011 >> 2 // das verschiebt die zahl um 2 stellen nach rechts
= 1100 // die letzten beiden stellen wurden einfach rausgeworfen.
-
Wichtig (hab ich ganz vergessen) die zahl 110011 ist binärdargestellt!
-
Vielleicht noch grundsätzlicher:
Man nehme den Datentyp char. Dieser hat eine Größe von 1 Byte == 8 Bit.
Jedes Bit kann den Wert 0 oder den Wert 1 annehmen.
Auch eine Dezimalzahl wird in einem System so gespeichert. Wenn Du also z. B. die Dezimalzahl 20 speicherst (in einem char), dann wird ein Byte belegt, und zwar mit 00010100. Wenn Du jetzt Bit für Bit diese Variable ausliest, hast Du sofort Deine gewünschte Binärdarstellung.
-
groovemaster2002 schrieb:
galilio12 schrieb:
wie kann mann das einfache programmieren ohne FKT
Was soll das heissen? Ohne Funktionen? Du bist dir aber schon klar was C++ bedeutet?
Raptor schrieb:
if(ascii[i]>=pow(2,j)) { cout << "1"; ascii[i]-=pow(2,j); }
Wieder einer der einfachste Algorithmen mit unbedachten Mitteln umsetzt. Naja, vielleicht gibts ja Compiler die das optimieren können. Dir ist offensichtlich nicht klar, dass pow(2,j) das gleiche Ergebnis liefert wie 1 << j. Letztere Variante ist für Prozessoren geradezu ein Witz im Vergleich zur ersten.
Ist 1 << j nicht eher ein j mal 2 als ein j hoch 2?
100 = 4
1000 = 811 = 3
110 = 61000 = 8
10000 = 16also, meiner Ansicht nach, ist pow(2,j) nicht gleich 1 << j.
-
pow(2, j) = 2 hoch j! Das ist diese berühmte Reihe: 1, 2, 4, 8, 16, 32, 64 usw.
1 << j ist genau das gleiche.
1 Dezimal = 1 Binär
2 Dezimal = 10 Binär
4 Dezimal = 100 Binär
8 Dezimal = 1000 Binär
16 Dezimal = 10000 Binär
usw.1 << j heißt, die binäre 1 wird j Stellen nach links verschoben. Aus meiner Tabelle ist ersichtlich, dass das das gleiche ist wie pow(2, j).
ich hoffe, es war nicht zu kompliziert
geloescht
-
Um mal mit Worten die kurzform zu beschreiben:
Die zahl eins (1) ist deine Bitmaske.
Diese "verundest" (bitoperator: &) du
mit deiner umzuwandelnden Zahl.Das Ergebnis
speicherst du in dein Array.Nun shiftest du
deine ausgangszahl um 1 nach rechts, und
wiederholst die Prozedur.
Die schleife endet wenn deine ausgangs zahl
0 geworden ist.
Das sind 2 Zeilen Programmcode.
Der Inhalt des Arrays muss nurnoch in der
Reihenfolge gedreht werden.
-
irgendwie steh ich grad auf dem Schlauch. Das Verfahren an sich ist klar, aber das funktioniert bei mir nicht:
#include <iostream> #include <vector> using namespace std; int main(int argc, char* argv[]) { int decimal; vector<int> binary; cin >> decimal; int digit; while (decimal != 0) { digit = decimal & 1; binary.push_back(digit); decimal = 1 >> decimal; } vector<int>::iterator begin; for (begin = binary.begin(); begin != binary.end(); ++begin) { cout << *begin; } return 0; }
Was mach ich falsch? decimal wird meistens schon nach dem ersten Durchlauf 0...
Danke, euer (auf der Leitung sitzender) smasher1985
-
Nimm decimal >> 1 statt 1 >> decimal. Ersteres verschiebt 1 um decimal binärstellen nach rechts wir wollen aber decimal um eine binärstelle nach rechts verschieben, also genau andersrum.
geloescht
-
upps, danke. Das war natürlich blöd...
Mfg, smasher1985
-
1>>decimal bedeutet das er 1 um decimal Stellen
nach rechts shiftet, und das soll er ja nich.
es muss also decimal>>1 heißen.
-
da war ich wohl zu lahm
-
geloescht schrieb:
pow(2, j) = 2 hoch j! Das ist diese berühmte Reihe: 1, 2, 4, 8, 16, 32, 64 usw.
1 << j ist genau das gleiche.
1 Dezimal = 1 Binär
2 Dezimal = 10 Binär
4 Dezimal = 100 Binär
8 Dezimal = 1000 Binär
16 Dezimal = 10000 Binär
usw.1 << j heißt, die binäre 1 wird j Stellen nach links verschoben. Aus meiner Tabelle ist ersichtlich, dass das das gleiche ist wie pow(2, j).
ich hoffe, es war nicht zu kompliziert
geloeschtJetzt hab's ich gemerkt, 2^j! Ich habe immer j^2 gelesen! 'ne neue Brille muss her...