Dezimal zu Binär



  • Ich kenne nur die Divisionsmethode, bei der man (per Modulo) sich den Rest der Division merkt. Alle Reste zusammen ergeben dann die binäre Zahl.
    Was genau meinst du mit AND 1.
    bs << n & 1;
    ?

    Moment..du meinst bestimmt etwas Bitmasken-ähnliches..muss ich mal drüber nachdenken. Du kannst gerne Beispielcode posten 🙂



  • Ich hab es jetzt mit der AND-Verknüpfung implementiert, funktioniert aber immer noch nicht. Es scheint am Stringstream zu liegen irgendwie, weder bs noch b haben einen Wert:

    string tobin(uint n) {
        uint m = 1;
        string result, b;
        stringstream bs;
        for (int i = 0 ; i <= n/32 ; ++i) {
            bs << (n & m);
            bs >> b;
            result += b;
            m <<= 1;
        }
    }
    

    Wäre schön, wenn jemand die Funktion verbessern könnte, sodass sie funktioniert.
    Generelle Optimierungen sind auch willkommen 🙂



  • string tobin (uint n) 
    {
       char b[65];
       return string (itoa(n,b,2));    
    }
    


  • Sorry, aber wie so oft brauche ich eine Lösung ohne stdlib, ich glaube itoa ist daraus.

    Die Stelle 'i <= n/32' oben ist übrigens auch Mist, habs erstmal durch log(n)/log(2) ersetzt, dadurch kriegt man die Stellen heraus, scheint aber von der Geschwindigkeit her überhaupt nicht optimal zu sein.

    An sich sollte selbst die einfache Divisionsmethode funktionieren, tut sie aber nicht, ich weiß nicht warum 😕


  • Mod

    das ganze hat nichts mit der berechnung sondern mit den streams zu tun - da hatten wir auch einen thread vor kurzem.
    eine möglichkeit:

    string tobin(uint n) {
        string b, b2;
        stringstream bs;
    
        for (; n > 0 ; n /= 2) {
            bs << (n % 2);
            bs >> b2;
            b  = b2 + b;
            bs.clear();
        }
        return b;
    }
    

    oder besser den stringstream gleich erst dort definieren, wo er gebraucht wird.



  • hier mal eine mit shift-op:

    [cpp]string dual(int temp)
    {
    string ergebnis="";
    while(temp>0)
    {
    if((temp & 1) > 0)
    ergebnis = "1" + ergebnis;
    else
    ergebnis = "0" + ergebnis;
    //mask = mask << 1;
    temp = temp>>1;
    }
    return ergebnis;
    }[code]

    gruß

    firefly



  • so jetzt mit passenden code-tags

    string dual(int temp)
    {
    	string ergebnis="";
        	while(temp>0)
    	{
    	    if((temp & 1) > 0)
        		ergebnis = "1" + ergebnis;
    	    else
    		ergebnis = "0" + ergebnis;
    	    //mask = mask << 1;
    	    temp = temp>>1;
    	}
    	return ergebnis;
    }
    


  • Hi,
    ich hab gerade einen Speed Vergleich der beiden Varianten gemacht, und die itoa Variante hat sich als *viel* schneller erwiesen, weshalb ich dann doch eher diese verwenden werde.

    Trotzdem danke 🙂
    Neo



  • SeppSchrot schrieb:

    Wozu denn den Modulo?

    Wäre ein Bit-AND mit 1 nicht besser?

    Dein Compiler wirds schon optimieren. 🙂

    FireFly1 schrieb:

    if((temp & 1) > 0)
        		ergebnis = "1" + ergebnis;
    	    else
    		ergebnis = "0" + ergebnis;
    

    Das ist kein guter Algo. Du hast hier im ungünstigen Fall eine Laufzeit von O(n*n/2). Das muss doch nicht sein, wenn O(n) der Normalfall ist.


  • Mod

    wenns um geschwindigkeit geht, ist sowieso LUT angesagt

    string tobin(uint n) {
        static const char lut[] =
            "0000""0001""0010""0011""0100""0101""0110""0111"
            "1000""1001""1010""1011""1100""1101""1110""1111";
        char result[ sizeof( uint ) * 8 + 1 ];
        result[ sizeof( uint ) * 8 ] = '\0';
        uint pos = sizeof( uint ) * 8, tmp = n;
        do {
            *reinterpret_cast<uint*>(&result[pos-=4])=*reinterpret_cast<uint*>(lut[tmp%16*4]);
        } while( tmp /= 16 );
        return &result[sizeof(uint)*8-bsr(n)]; // volkard's bit-scan :)
    }
    

Anmelden zum Antworten