Umwandlung von Dezimalzahl zu Binärzahl



  • 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 😕



  • Äh nein! Die Reihenfolge sollte stimmen.



  • groovemaster2002 schrieb:

    WilderSchorsch schrieb:

    Was wäre denn

    pow(16,j)?

    mit einem shift operator?

    1 << (4 * j)

    Ist denn dies schneller als pow(16,j)?



  • char* inttobin(int x){return itoa(x,"",2);}
    
    char* inttohex(int x){return itoa(x,"",16);}
    
    char* inttooct(int x){return itoa(x,"",8);}
    


  • WilderSchorsch schrieb:

    Ist denn dies schneller als pow(16,j)?

    Wieso machst du nicht mal nen Benchmark Test und teilst uns die Ergebnisse mit?

    MaSTaH schrieb:

    Äh nein! Die Reihenfolge sollte stimmen.

    Das ist wohl auch das einzigste was da stimmt. 😃
    Wo bleibt nur dieser Shlemiel?


Anmelden zum Antworten