Dezimal->Binär



  • shellfisch schrieb:

    EOP schrieb:

    Ist zwar beschränkt aber schell

    Ja, schell ist es, aber schnell nur beschränkt. operator+=(const char*) ist alles, nur nicht C (und damit auch nicht schnell).

    Da hast du recht und ich nicht drauf geachtet wo es gepostet wurde.
    Nimmt man eben strcat.

    char line[100] = "\0";
    	char ich = 30;
    	strcat( line, (ich & 0x80) == 0x80 ?  "1" : "0" );
    	strcat( line, (ich & 0x40) == 0x40 ?  "1" : "0" );
    	strcat( line, (ich & 0x20) == 0x20 ?  "1" : "0" );
    	strcat( line, (ich & 0x10) == 0x10 ?  "1" : "0" );
    	strcat( line, (ich & 0x08) == 0x08 ?  "1" : "0" );
    	strcat( line, (ich & 0x04) == 0x04 ?  "1" : "0" );
    	strcat( line, (ich & 0x02) == 0x02 ?  "1" : "0" );
    	strcat( line, (ich & 0x01) == 0x01 ?  "1" : "0" );
    

    oder:

    int i;

    for( i = 0x80; i > 0; i >>= 1 )
    	strcat( line, (ich & i) == i ?  "1" : "0" );
    


  • Wie wärs mit

    const int length=32;
    
    int number=7;
    
    char Binary[length+1];
    unsigned int pos=1;
    for(int i=0; i<length; i++)
    {
        Binary[length-i-1] = (number & pos) == 0 ? '0' : '1'; 
        pos <<=1;
    }
    Binary[length]='\0';
    


  • LOL, hab nicht gedacht, daß um kurz vor 5 jemand das liest.



  • EOP schrieb:

    Nimmt man eben strcat.

    Und strcat ist eine Schnelle Funktion?

    EOP schrieb:

    int i;
    for( i = 0x80; i > 0; i >>= 1 )
    	strcat( line, (ich & i) == i ?  "1" : "0" );
    

    Sowas kommt raus, wenn man die "Strings" von C nicht verstanden hat.

    EOP schrieb:

    LOL, hab nicht gedacht, daß um kurz vor 5 jemand das liest.

    Ich habe noch dein uneditierten Post gelesen und mich eben über den Code gewundert. 😃


  • Mod

    DarkShadow44 schrieb:

    Wie wärs mit

    const int length=32;
    
    int number=7;
    
    char Binary[length+1];
    unsigned int pos=1;
    for(int i=0; i<length; i++)
    {
        Binary[length-i-1] = (number & pos) == 0 ? '0' : '1'; 
        pos <<=1;
    }
    Binary[length]='\0';
    

    Und somit sind wir wieder da, wo der TE war, als er gefragt hat 🙂 . Der Ursprungscode war eben schon ganz ok.

    Aber EOP hat hoffentlich was daraus gelernt 🕶



  • danke für die Antworten.

    Da die Frage aufkam, warum ich nicht einfach die Zahl 13, die ja im Speicher eh schon als Folge von 0 und 1 vorliegt, verwende.

    Ich brauch eine exakte binäre Darstellung einer Zahl, die ich in ein BYTE Array schreibe und das klatsche ich dann auf ein (primitives) Speichermedium.
    Würde ich einfach byteweise die Variable int x=13 in das Array verschieben, so hängt das Ergebnis von Dingen wie Endianess ab.

    Ich hingegen möchte auf dem Speichermedium z.B. an Stelle Byte=2 im Bitbereich 3-6 den Wert 13 abspeichern. Ich berechne mir also die Binärdarstellung von 13, diese ist 1101, und nun setze ich in Byte 2 die Bits folgendermaßen:

    ...
    Byte2
    Bit1=?
    Bit2=?
    Bit3=1
    Bit4=1
    Bit5=0
    Bit6=1

    Bit7=?
    Byte3
    ...


  • Mod

    Dann ist dein Ursprungsalgorithmus absolut 100% ok. Im Prinzip auch alle anderen, denn ich sehe nicht, wieso hier Performance relevant sein sollte. Natürlich nicht so, wie von EOP vorgemacht, das wäre bloß Verschwendung. Aber man braucht auch keine unleserlichen Mikrooptimierungen, die vielleicht hier und dort einen einzelnen Takt sparen könnten. Das Speichermedium (selbst wenn es DRAM sein sollte) dürfte schließlich um Größenordnungen langsamer sein als ein Prozessor.

    Falls es keine Überschneidungen zwischen den Bytes auf dem Speichermedium geben sollte, spielt Endianess übrigens keine Rolle und du kannst alles durch einfaches Shiften erreichen.



  • 01000100010101010110 schrieb:

    Würde ich einfach byteweise die Variable int x=13 in das Array verschieben, so hängt das Ergebnis von Dingen wie Endianess ab.

    Sag das doch gleich.

    Da kannst du auf so Funktionen wie man: htonl (gibts auch für Windows) zurückgreifen oder die Zahlen als Zeichenkette speichern (das ist dann langsam).

    Es gibt auch noch superoptimierte Formate, die kleine Zahlen in einem Byte und grössere in mehreren speichern.



  • SeppJ mach mich bitte nicht weinen.
    Ich kann Kritik von vielen ertragen, aber nicht von dir.

    Nicht alle meine posts sind so 100% ernsthaft. Besunders nicht um 1/2 5 morgens. (Für die, die's noch nicht gemerkt haben)


  • Mod

    EOP schrieb:

    SeppJ mach mich bitte nicht weinen.
    Ich kann Kritik von vielen ertragen, aber nicht von dir.

    Nicht alle meine posts sind so 100% ernsthaft. Besunders nicht um 1/2 5 morgens. (Für die, die's noch nicht gemerkt haben)

    Dafür war's dann wieder zu gut 🙂 . Sah aus wie ein ernsthafter Versuch, der ausgerechnet an einer Stelle (Zeichenkettenbehandlung in C) fehlschlug, an der schon viele verzweifelt sind.



  • SeppJ schrieb:

    EOP schrieb:

    SeppJ mach mich bitte nicht weinen.
    Ich kann Kritik von vielen ertragen, aber nicht von dir.

    Nicht alle meine posts sind so 100% ernsthaft. Besunders nicht um 1/2 5 morgens. (Für die, die's noch nicht gemerkt haben)

    Dafür war's dann wieder zu gut 🙂 . Sah aus wie ein ernsthafter Versuch, der ausgerechnet an einer Stelle (Zeichenkettenbehandlung in C) fehlschlug, an der schon viele verzweifelt sind.

    Na was gibt's denn jetzt schon wieder zu meckern?
    Ist 1A C, funktioniert. macht kein malloc ohne free usw., usf.
    Ihr seid ja schon ein bißchen pingelig. Oder?

    EDIT:
    Und außerdem war die Zeichenkettenbehandlung mehr als exklusiv hervorragend.

    Wollt ich nur mal so erwähnt haben.
    Mehr als exklusiv hervorragend war die. 😛



  • War eigentlich nur ein Spaßprogramm, das ich nur so hingerotzt hsbe.
    Sollte nur alles in binär ausgeben. Hingerotzt eben.


  • Mod

    😕 War es nun Spaß oder war die Benutzung von strcat doch ein Versehen aus Unwissen?


Anmelden zum Antworten