Dual Dezimal Umwandlung C-Programm



  • Wie genau will er es denn? Also Windalfs Funktion kannst du ja im Prinzip ganz einfach mit printf()-Aufrufen zwischendurch kommentieren lassen. Oder verstehst du die Funktion grundsätzlich nicht? Dann schiebs auf Windalfs Variablennamen - achso diesmal hat er ja nur i 🙄 *insider*

    Hier mal ein erster Ansatz, die for-Schleife hab ich durch eine while-Schleife ersetzt um besser kommentieren zu können.

    void binaer_ausgeben (unsigned int zahl)
    {
        printf("Binäre Ausgabe\n\n");
    
        // In dieses printf() hab ich Returns reingemacht damit die Formatierung nicht so grauenhaft ist :-)
        printf("Basiert darauf, die Anzahl der Bits der übergebenen Zahl zu 
    ermitteln und daraufhin jedes Bit der Reihe nach an den Beginn der Zahl zu 
    verschieben (Methode: Bit-Shifting), danach Prüfung ob das Bit 1 oder 0 ist 
    (Methode: Bitweises &) und das jeweilige Ergebnis ausgeben.\n\n");
    
        printf("Anzahl der Bits der gesamten Zahl in i speichern.\n");
        int i = 8 * sizeof(unsigned int);
    
        while(i != 0) // Äquivalent zu while(i)
        {
            printf("i ist nun: %d\n",i);
    
            unsigned int bit = zahl >> (i-1);
    
            printf("Das Bit lautet: %d\n\n",bit&1);
    
            --i;
        }
    }
    

    Hoffentlich stimmt auch alles...

    MfG SideWinder



  • also die funktion hab ich nu so langsam überblickt wie das gemeint ist, leider kann ich das so net gebrauchen ;/

    in der aufgabenstellen wird ausdrücklich gesagt das ganze soll durch division des zielsystems berechnet werden

    also von dez auf dual so

    129 :2 = 114 Rest 1

    114 :2 = 57 Rest 0

    57 :2 = ..........

    Die Dualzahl ist dann von unten nach oben gelesen.

    und wie das oben ausschaut, soll das auch auf dem bildschirm kommen, aber dez auf dual hab ich scho das war ja kein prob

    das prob ist nur, DIESES verfahren anzuwenden wenn ich von dual auf dez rechnen soll

    also 101111 : 1010 = xx Rest yy
    xx : 1010 = zz Rest ...

    ich soll das GENAU so machen, und net indem ich irgendwie da bit shifting mach oder kapier ich das ganze gar net

    so wie ich die funktion verstanden hab übergibt die der var zahl die daten von der var mit der ich die funktion aufruf

    in der forschleife nimmt der die variable i setzt die auf 8 fache größe von also in dem fall glaube 8*4 bits

    in der schleife verschiebt der die variable zahl um i-1 bit, dann vergleicht er das niedrigste bit mit & 1 und gibt am bildschirm ne 1 aus wenn das 1 ist und ne 0 wenn das null ist 🙂 durchläufter der die for schleife neu, inkrementiert der i um eins und bekomm wieder bis i auf 0 ist

    der macht also nix anderes als die interne bitdarstellung auszugeben und zwar net hex oder dez sondern halt dual

    nur ich soll das ja net SO machen durch den TRICK, sondern ich soll das berechnen



  • ich poste mal fix nen teil der aufgabenstellung.

    erstellen sie ein programm das von dezimalsystem /255) ins dualsystem (8 bit) und umgekehrt eine zahl umrechnet und zwar nach dem prinzip der fortgesetzten division im zielsystem. der rechenweg muss auf dem bildschirm ersichtlich sein..

    rest ist dann noch menüs und fehler abfangen und so zeug dsa ist aber net so wild 🙂

    nur das von dual auf dezimal macht mich fertig 🙂



  • Zuerst nochmal zur Funktion von Windalf - die macht genau folgendes:

    Beispiel-Zahl: 10101110 (wir machens nur für 8 Bit)
    
    i = 8; // Nicht 8*sizeof(unsigned int) da wir ja nur 1 Byte haben und nicht 4
    
    bit = zahl >> (i-1); // bit = 00000001 [zahl>>7]
    Ausgabe: bit&1 // 000000001 & 000000001 = 000000001 = 1
    
    i = 7; // --i
    bit = zahl >> (i-1); // bit = 00000010 [zahl>>6]
    Ausgabe: bit&1 // 00000010 & 00000001 = 00000000 = 0
    
    i = 6; // --i
    bit = zahl >> (i-1); // bit = 00000101 [zahl>>5]
    Ausgabe: bit&1 // 00000101 & 00000001 = 00000001 = 1
    
    ...
    

    Das ist offensichtlich nicht die Methode nach der du vorzugehen hast 🙂

    Das Problem ist ja offensichtlich, dass C keine Zahlensysteme in dem Sinne kennt. Ob sie die Zahl nun als 0x1 oder als 1 interpretiert ist ja kein Unterschied in der Speicherung -> beides wird als 00000001 gespeichert...

    MfG SideWinder



  • ja genau das ist das prob, ich kann mit c net binär rechnen 🙂

    aber ganau das soll ich programmieren irgendwie kapier ich das net 🙂

    falls mir einer erklären kann wie ich auf deutsch eine division im dualsystem in C realsieren kann, bitte melden,



  • und scho mal vielen dank für die netten helfer hier 🙂



  • Man könnte das ganze Verfahren auch entkryptisieren, indem man den Modulo- und Divisionsoperator wirklich hinschreibt, und keine Bitgefiesel. Dann macht man zwar etwas ungewohnte Integermathematik (1/2 == 0), aber man kann schließlich nicht alles haben.

    Ich mach mal ein Beispiel, sagenwirmal 456.

    456 % 2 = 0
    456 / 2 = 228
    228 % 2 = 0
    228 / 2 = 114
    114 % 2 = 0
    114 / 2 = 57
    57 % 2 = 1
    57 / 2 = 28
    28 % 2 = 0
    28 / 2 = 14
    14 % 2 = 0
    14 / 2 = 7
    7 % 2 = 1
    7 / 2 = 3
    3 % 2 = 1
    3 / 2 = 1
    1 % 2 = 1
    1 / 2 = 0

    Die Ziffern, die Resulat des Modulooperators waren, kann man sich jetzt ansehen, und kommt (rückwärts gelesen, natürlich) zu 111001000, was komischerweise genau die Binärrepräsentation für 456 ist.

    Ist eine Zahl ungerade (zahl%2, zahl&1), so bedeutet das, daß an der 2^0er also der letzten Stelle eine 1 zu stehen hat, sonst eine 0. Die Division (bzw das >> 1) durch zwei macht jetzt nichts anderes, als das eben gelesene Bit wegzuwerfen, und die bisher noch nicht betrachteten Bits um eine Position nach rechts zu verschieben.



  • Also Windalfs Funktion kannst du ja im Prinzip ganz einfach mit printf()-Aufrufen zwischendurch kommentieren lassen. Oder verstehst du die Funktion grundsätzlich nicht? Dann schiebs auf Windalfs Variablennamen - achso diesmal hat er ja nur i *insider*

    hatte ich eigentlich erwähnt das ich mir diese funktion patentiert habe 😃

    edit:

    wenn du das mit teilerrei machen willst kannst du es z.b. so machen habs mal auf basis von 2 bis 16 erweitert...

    void convert_number2base(unsigned int z,int b){if(z){convert_number2base(z/b,b);printf("%c",z%b+48+(z%b>9)*7);}}
    


  • an daniel

    genau so hab ich dez in dual aufgebaut 🙂 und so sollen wir das auch machen

    nur bei dual in dez bin ich da in schwierigkeiten gekommen 😃



  • huhu die funktion funktioniert super von dez auf hex, dual...

    danke bau ich glaube in mein progi ein

    aber :

    mein hauptprob besteht da drin von dual auf dez zu rechnen ^^



  • ne andere lösung hät ich jetzt scho ich les die zahl in nem array ein und verlgeiche jedes feld im array mit & 1 und wenn bit 1 eins dann sag ich der soll 2^0 rechnen wenn bis 3 1 dann soll er 2^3 rechnen nur leider ist ds jetzt keine division mehr wie ich das eigentlich machen soll



  • von dual auf dezimal zu rechnen macht überhaupt keinen sinn weil wenn du die zahl zusammenaddierst kommt sowieso wieder das gleiche raus... er speichert es ja eh binär... was für ein blödsinn da was zu rechnen wo es gar nix zu rechen gibt...



  • tja, ich glaub es geht bei dem programm auch net um sinn oder unsinn, sondern das ist die aufgabe 🙂
    ich find das auch irgendwie idiotisch aber die aufgabenstellung lautet so 😃



  • also bei der umwandlung von dual nach dezimal macht man das genauso wie du vorher beschrieben hast man nimmt immer dsa jeweilige byte und multipliziert es mit 2 hoch der jeweiligen wertigkeit...
    das kannst du wenn du es mit deiner teilerei machen willst dadurch erreichen das du immer %2 rechnest oder &1 und herauszubekommen ob das jeweilge bit gerade 0 oder 1 ist... und das ganze multiplizierst du dann mit der entsprechend wertigkeit.... danach immer durch 2 teilen um das nächste byte zu bekommen (das teilen ist eigentlich nicht nötig aber wenn du es unbedingt so machen willst)

    der schwachsin bei der aufgabe liegt darin das du das ergebnis ja in irgend einer variablen speichern musst und und dieser variable wird das ja wieder binär gespeichert. du bist also nach der rechnung genauso schlau wie vorher. es gibt da also nix umzuwandeln...



  • Windalf schrieb:

    der schwachsin bei der aufgabe liegt darin das du das ergebnis ja in irgend einer variablen speichern musst und und dieser variable wird das ja wieder binär gespeichert. du bist also nach der rechnung genauso schlau wie vorher. es gibt da also nix umzuwandeln...

    Das kommt natürlich auf das Eingabeformat an. Wo stand denn, daß das ein Integer, und nicht etwa ein String der Form "100101110", sein muss?



  • @Daniel E.
    ups stimmt in dem fall würde es sogar sinn machen...



  • na ja ich hätte einige möglichkeiten wie ich das von dual auf dez machen kann, nur leider ist das net das verlangte, das ist das prob der hat explizit vorgeben wie das ausschauen soll

    nochmal das beispiel:

    z.b. die dualzahl 1111 basis von dez system ist 10 also 1010

    jetzt soll am bildschirm nachdem du 1111 eingeben hast das ausgegeben werden:

    1111 : 1010 = 1 Rest 5
    1 : 1010 = 0 Rest 1

    Dualzahl 1111 ist die Dezimalzahl 15

    Genau so soll das ausschauen

    Also das Problem: wie bekomm ich raus, wieviel mal die 1010 in der dualzahl 1111 oder einer anderen 8 bitigen dualzahl steckt und dann noch den rest denn ich dann wieder teilen muss



  • meine möglichkeit wäre mit dem 2 er komplement also mit 0111 zu addieren

    also
    1111
    +0111

    wenn dort ein übertrag rauskommt kommt ne 1
    wenn eine 0 rauskommt muss ich alles zurücknehmen und dann ein bit dazu und wieder 0111 dazu
    am ende wird dann ein rest bleiben und als ergebniss ne dualzahl stehen

    das ist glaube der normale weg wie man eine division im dualen durchführt, das 2 er komplement von divisor addieren und dann das mit dem übertrag

    aber selbst das mit dem addieren geht ja net weil der dann wieder 1+1= 2 draus macht und mit & gehts auch net, weil der bei 1 & 1 ja 1 ausgibt aber da msus ja 0 stehen + übertrag welcher zum nächsthöheren bit dazugezählt wird,
    also müßtest du jedes bit irgendwie verlgeichen ob da was > 1 rauskommt und wenn ja dann ne variable setzen die dann bei der nächsten x & y dazugerechnet wird

    am ende wird das enorm kompliziert und kein mensch kennt sich mehr aus

    morgen geh ich nochmal zu dem prof und frag ob der das so kompliziert verwirklicht haben will, weil ich sehe ehrlich gesagt auch keinen sinn das ganze auf so einem weg zu machen, wenn das viel viel einfacher ginge

    ps: falls sich hier einer genervt fühlen sollte, weil ich soviele anfragen stell und net locker lass, denkt dran, ich fühl mich bestimmt noch viel mehr genervt, so eine scheiss aufgabe zu bekommen 😃



  • als erster müssten wir mal wissen in welcher form deine dualzahl vorliegt...
    ist das ein char-array oder irgenwas anderes?



  • Wandiii schrieb:

    aber selbst das mit dem addieren geht ja net weil der dann wieder 1+1= 2 draus macht

    Doch, es geht. Wenn Du für jede Stelle so addierst:

    erg[i] = (a[i] + b[i] + uebertrag) % 2;
    uebertrag = (a[i] + b[i]) / 2;
    

    Das ganze in einer Schleife vom niedrigstwertigen zum höchstwertigen - fertig.


Anmelden zum Antworten