Umwandlung von Dezimalzahl zu Binärzahl



  • 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üllt

    110011 >> 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 = 8

    11 = 3
    110 = 6

    1000 = 8
    10000 = 16

    also, 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 😃
    geloescht

    Jetzt hab's ich gemerkt, 2^j! Ich habe immer j^2 gelesen! 'ne neue Brille muss her...



  • Was wäre denn

    pow(16,j)?

    mit einem shift operator?



  • WilderSchorsch schrieb:

    Was wäre denn

    pow(16,j)?

    mit einem shift operator?

    4 << j?



  • da der links-shift einer multiplikation mit zwei gleich kommt
    und viermal nachlinks somit 2*2*2*2 (also 16) ist, ja.



  • WilderSchorsch schrieb:

    Was wäre denn

    pow(16,j)?

    mit einem shift operator?

    1 << (4 * j)



  • Wie ich sehe sind hier ja die absoluten Optimierungsexperten am Werk 🙄 .

    Warum nicht gleich so etwas?

    std::string int2bin(int x) {
      std::string str;
      do str = (x & 1 ? "1" : "0") + str;
      while(x>>=1);
      return str;
    }
    


  • Weil nun die Bits in der Ausgabe von vorne nach hinten vertauscht sind, oder irre ich mich da 😕


Anmelden zum Antworten