Binär???



  • 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



  • junix schrieb:

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

    sowas kleines mach ich eher auf performance. einfach wirds dabei von alleine. zum beispiel, daß die if-while-kostruktion durch ne do-schleife ersetzt werden konnte.
    und die vielen += auf strings sind gar nicht so klasse. das ?: wird zu nem sprung und der ist teuer. statt >>= verwende ich leiber /=, denn der optimierende compiler kann /= zu >>= selber machen. und beim ?: (was ich nich verwende) würd ich noch schnell schauen, obs nicht nach = erst drankommt.



  • volkard schrieb:

    und die vielen += auf strings sind gar nicht so klasse.

    Dank dem Vorreservieren wirds nicht halbso teuer wie wenndu das bei nicht vorreserviertem Speicher machst... (ist noch bei vielen Containern der STL so). Im Gegenteil. Es kann sogar massiv schneller sein, den Bedarf an Bytes zunächst zu errechnen und dann gezielt zu reservierst, als immer mal wieder auf die allocator des Containers zu warten. (Solange du dich nicht innerhalb eines Blocks bewegt welcher der Allocator sowieso reserviert). Zugegeben, ist nicht unbedingt schneller als dein Byte-Array

    volkard schrieb:

    das ?: wird zu nem sprung und der ist teuer.

    Kannst du recht haben, weiss ich nicht genau... Müsste ich mal nachprüfen wieviel teurer mich das zu stehen kommt.

    volkard schrieb:

    statt >>= verwende ich leiber /=, denn der optimierende compiler kann /= zu >>= selber machen.

    Nur, dass >>= mehr dokumentiert als ein /= ... kommt aufs Selbe wie wenn einer statt ein <<= 3 zu machen einfach nen 2 * 2 * 2 macht (und nicht mal 8 rechnet, damit er selbst dokumentiert hat wieviele bits er schiebt)... liest sich wie sau und auf den ersten Blick ist nicht ersichtlich was er da eigentlich will. (wahrscheinlich gewöhnungssache)

    volkard schrieb:

    und beim ?: (was ich nich verwende) würd ich noch schnell schauen, obs nicht nach = erst drankommt.

    Nein hier weiss ich, dass ?: höhere Priorität hat...
    Ausserdem... was wollte er sonst zuweisen, wenn er nicht den Ausdruck auswertet?

    -junix



  • btw. Deine Funktion hat nen hässlichen Fehler: Der Nullabschluss fehlt... (o;

    -junix



  • junix schrieb:

    volkard schrieb:

    statt >>= verwende ich leiber /=, denn der optimierende compiler kann /= zu >>= selber machen.

    Nur, dass >>= mehr dokumentiert als ein /= ... kommt aufs Selbe wie wenn einer statt ein <<= 3 zu machen einfach nen 2 * 2 * 2 macht (und nicht mal 8 rechnet, damit er selbst dokumentiert hat wieviele bits er schiebt)... liest sich wie sau und auf den ersten Blick ist nicht ersichtlich was er da eigentlich will. (wahrscheinlich gewöhnungssache)

    du spielst mit bits und ich mit zahlen.
    aus der version für binärzahlen

    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); 
    }
    

    wird leicht eine für zahlen oktalsystem

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

    indem ich an zwei stellen statt 2 jetzt 8 schreibe. hab also eigentlich den beliebigen zahlenumwandler gebaut (auch deshalb + statt ?:) und der klappt halt auch für 2 und ist schnell.



  • junix schrieb:

    btw. Deine Funktion hat nen hässlichen Fehler: Der Nullabschluss fehlt... (o;
    -junix

    ab doch den stringkonstruktoe mit start und länge genommen. um noch nen sinnlosen aufruf von strlen zu vermeiden und dem string zu erlauben, sofort speicher in richtiger länge zu allokieren.



  • volkard schrieb:

    indem ich an zwei stellen statt 2 jetzt 8 schreibe. hab also eigentlich den beliebigen zahlenumwandler gebaut (auch deshalb + statt ?:) und der klappt halt auch für 2 und ist schnell.

    Wusst' ich doch, dass da was dahinter steckt (o: Wieso muss man dich immer rausfordern bis du mit sowas hinter Ofen vor kommst (o;

    -junix



  • junix schrieb:

    volkard schrieb:

    und die vielen += auf strings sind gar nicht so klasse.

    Dank dem Vorreservieren wirds nicht halbso teuer wie wenndu das bei nicht vorreserviertem Speicher machst...

    du braucht trotzdem pro += einen test, ob das neue zeichen noch inm den string paßt oder ob er wachsen muß. hab ich mir gespart.

    junix schrieb:

    Im Gegenteil. Es kann sogar massiv schneller sein, den Bedarf an Bytes zunächst zu errechnen und dann gezielt zu reservierst, als immer mal wieder auf die allocator des Containers zu warten. (Solange du dich nicht innerhalb eines Blocks bewegt welcher der Allocator sowieso reserviert). Zugegeben, ist nicht unbedingt schneller als dein Byte-Array

    nennen wirs mal ganz neutral, und ohne werten zu wollen, "lahmer"?



  • @DrGreenthumb Genau das was Konstantin sagte meinte ich 😉

    @Bitschieberei&Pow Schirbe gerne bits, habt ihr n sinnvolles tut darüber? hab davon nämlich noch nix in meinen schlauen büchern gefunden ^^



  • #include <bitset>
    #include <string>
    
    std::string int_to_bin(unsigned int i)
    {
      return std::bitset<8>(i).to_string();
    }
    

    Man kann auch ruhig das benutzen, was im Standard schon vorhanden ist. 😃

    ps.: Das bitset ist hier auf 8 bit beschränkt - könnten genau so gut auch mehr sein...



  • Hatten wir das Thema nicht vor ner Woche schon mal umgekehrt?



  • In dem Fall ist es sogar noch viel sinnvoller, die Zahl einfach so zu benutzen, in etwa:

    enum flags {
      ist_dumm       = 1,
      ist_praesident = 2,
      heisst_bush    = 4
    }
    
    //...
    
    void do_something(flags f) {
      if(f & ist_dumm) {
        std::cout << "Was für ein Idiot!" << std::endl;
      }
    }
    
    //...
    
    flags dubya_flags = ist_dumm | ist_praesident | heisst_bush;
    do_something(dubya_flags);
    


  • Oh, verdammt. Entschuldigt das, ich hatte nur die erste Seite gesehen, und da hätte das Sinn gemacht...



  • Lol...ich frag mich vor allem, wie man auf so einen alten Thread stößt. 🤡



  • CarstenJ schrieb:

    Lol...ich frag mich vor allem, wie man auf so einen alten Thread stößt. 🤡

    😃 👍



  • Heh. Ich bin halt Archäologe 😉

    Nein, eigentlich hab ich nach einem neueren Thread gesucht, dessen Titel ich vergessen hatte und der von einem ähnlichen Thema handelte.




Anmelden zum Antworten