Binär???



  • Und hier noch die Quelle für all die Lösungen:
    http://c-plusplus.net/forum/viewtopic.php?t=42933

    -junix



  • Kann ich schweigen angesichts der Tatsache, daß schon wieder jemand POW benutzt, um Bits zu ermitteln?

    Immer das gleiche: mit dem 4,8 Tonner zum Getränkeladen fahren, um zwei Kästen Coke zu holen... 😮



  • Auch wenn das hier ein C++ forum ist sollte man einfache Lösungen nicht vergessen

    char buffer[8+1];
       int i;
    
       _itoa( (i % 256), buffer, 2 );
    

    i zu konvertierender Wert
    buffer Stringbuffer ausreichend groß
    2 Basis zu der der Wert gebildet werden soll

    String of integer 117 (radix 2): 01110101

    Siehe VC 6.0 hilfe mit itoa
    😃 😃



  • Hab auch schon danach gesucht, aber nicht mehr gefunden. 👍
    Meine ursprüngliche Variante entsprach der von The_Freak, bis ich mich belehren lassen musste, das Bitrotation viel schöner ist. 🙂
    Hab nur für mich nach ner Lösung gesucht alle Integerzahlen Binär darzustellen. 🙂



  • @PAD

    Den kannte ich noch nicht. 👍



  • @_stefan

    Wen PAD oder itoa? :p 🕶



  • <wollte eigentlich was sagen und es dann wieder löschen; löschen geht aber nicht!?>



  • Durch die Modulo Operation wird der wert auf den Bereich von 0x00 bis 0xff eingeschränkt.

    Eine sinvolle und wahrscheinlich schnellere, somit bessere Alternative ist

    i=i&0xff;
    


  • Ein guter Compiler wird in beiden Fällen identischen Code erzeugen.



  • Dazu ist zu sagen, dass itoa nicht portabel ist. Also vorsicht!
    Zum Thema itoa gibts übrigens auch einige Kommentare in dem von mir geposteten thread.

    -junix



  • Ich habe mal folgenden Code geschrieben, aber leider klappt bisher die &-Operation nicht, und ich weiß beim besten Willen nicht wieso.

    #include <iostream.h>
    #include <string>
    #include <math.h>
    
    using namespace std;
    
    string DezToBin(int Dez);
    
    int main()
    {
    	char Again;
    	int Dez;
    	string Bin;
    	do{
    		cout << "Geben sie die gewuenschte Dezimalzahl ein:"<<endl;
    		cin >> Dez;
    		Bin = DezToBin(Dez);
    		cout << "Die gesuchte Binaerfolge lautet: " << Bin.c_str()  << endl;
    		cout << "Weitere Zahl? (Y/N)"<<endl;
    		cin >> Again;
    	}while(Again == 'Y' || Again == 'y');
    
    	return 0;
    }
    
    string DezToBin(int Dez)
    {
    	string Bin;
    	if (Dez > 0){
    		int Elements = log10(Dez)/log10(2);
    
    		for(int i=Elements;i>=0;i--){
    			if (Dez & (2^i)==0)
    				Bin += "0";
    			else
    				Bin += "1";
    		}
    	}else
    		Bin = "0";
    
    	return Bin;
    }
    

    Vielleicht kann mich ja jemand hier verbessern?

    Danke im Voraus,
    Flux



  • 2^i bedeutet nicht 2 hoch i... '^' ist der bitweise Not-Operator.
    Schau dir die anderen Beiträge nochmal an. Normalerweise macht man das mittels shiften.

    Dez & (1<<i)



  • Ah, genau, stimmt ja, das Problem hat ich schon mal... 😉 Vielen Dank!!

    So, jetzt geht die Funktion:

    string DezToBin(int Dez)
    {
    	string Bin;
    	if (Dez > 0){
    		int Elements = log10(Dez)/log10(2);
    
    		for(int i=Elements;i>=0;i--){
    			if ((Dez & int(pow(2,i)))==0)
    				Bin += "0";
    			else
    				Bin += "1";
    		}
    	}else
    		Bin = "0";
    
    	return Bin;
    }
    

    Grüße,
    Flux



  • ..und einmal mehr die Frage: Wozu pow?!?
    Da ist ja die unleserliche Multiplikation mit 2 noch effektiver als pow... Was hast du nur gegen die Bitschieberei? Nur weils ObjektOrientiert ist, braucht man noch lange nicht die Hände möglichst von binären Dingen zu lassen...

    -junix



  • Ok, ist klar, du hast Recht. Habs jetzt mal so gemacht:

    string DezToBin(int Dez)
    {
    	string Bin;
    	if (Dez > 0){
    		int Elements = log10(Dez)/log10(2);
    		int pot=pow(2,Elements);
    
    		for(int i=Elements;i>=0;i--){
    			if ((Dez & pot)==0)
    				Bin += "0";
    			else
    				Bin += "1";
    
    			pot>>=1;
    		}
    	}else
    		Bin = "0";
    
    	return Bin;
    }
    

    Ist das eine Pow am Anfang ok? Ich weiß, man könnte die pot Variable zu Beginn auch auf 0 setzen und dann die schleife von 0 zu Elements durchlaufen, aber irgendwie hat das dann nicht mit dem Bin.append hingehauen.

    Grüße,
    Flux



  • /* verlesen */



  • Kommentierste das oben mal bitte? Irgendwie werd ich nicht ganz schlau aus deinem geschreibsel (mag auch an der unmöglichen Formatierung liegen). Was willst du nur immer mit deinem pow? Um sowas zusammenzuschneidern brauch ich kein einziges mal eine Potenz von irgendwas?!?

    -junix



  • Jap, sorry, hab mich wirklich etwas schlampig ausgedrückt. Wie auch immer, das Problem mit dem string hab ich jetzt nicht mehr, und das ganze ist jetzt ohne jedes Pow gelöst:

    string DezToBin(long Dez)
    {
    	string Bin;
    	if (Dez > 0){
    		int Elements = log10(Dez)/log10(2);
    		long pot=1;
    
    		for(int i=0;i<=Elements;i++){
    			if ((Dez & pot)==0)
    				Bin.insert (0, "0");
    			else
    				Bin.insert (0, "1");
    
    			pot<<=1;
    		}
    	}else
    		Bin = "0";
    
    	return Bin;
    }
    

    Grüße,
    Flux



  • Fluxx schrieb:

    Ist das eine Pow am Anfang ok?

    nee

    string dez2bin(int x)
    {//ungetestet
       char buf[32];
       char* p=buf+32;
       do
          *--p='0'+x%2;
       while(x/=2);
       return string(p,buf+32-p);
    }
    


  • iiih... volkard sieht ja hässlich aus die Konstruktion (o:

    Wieso nicht einfach sowas:

    string dez2bin(int x)
    {//ungetestet 
       string bin_str("");
       bin_str.reserver(32); // war das der Aufruf? 32 Byte schonmal vor allokieren
       int mask_int = 0x01;  // Bitmaske
    
       do
       {
           bin_str += (x & mask_int) ? '1' : '0';
           mask_int <<= 1; // Maske um eins verschieben
       }
       while (mask_int);
    
       return bin_str; 
    }
    

    Wennde den ? Operator noch durch einfreundliches if ersetzt kanns sogar jeder lesen und ist doch irgendwie übersichtlicher?

    -junix


Anmelden zum Antworten