Dual Dezimal Umwandlung C-Programm



  • hallo

    ich habe ein problem

    ich soll ein programm schreiben, welches dual in dezimal und dezimal in dual wandeln kann. von dezimal auf dual war das ja auch kein problem.

    aber mit dual auf dezimal komm ich net weiter:

    das probs ist, laut aufgabenstellung soll das durch division der basis des zielsystems erfolgen also in etwa so:

    dual: 1111 :1010 (basis des dez.) = 1 REST 5
    1 :1010 = 0 Rest 1

    Ergebnis: 15 dez.

    mein prob ist nun, dass es in c keinen binären variablentypen gibt:

    wie kann ich in C doch in dualzahlen rechnen? oder funzt das ganze durch bitmanipulation oder mit & und | ?

    danke scho mal



  • Wie bekommst du denn die Dualzahl an deine Funktion? Als String?

    MfG SideWinder



  • void binaer_ausgeben(unsigned int zahl){
    for(int i=8*sizeof(unsigned int);i;--i)
        printf("%d",(zahl>>(i-1))&1);
    }
    


  • erstmal thx

    also die funktion funktiert erstmal wunderwar, hab sie auch scho für meine verhältnisse angepasst, so dass das endergebnis stimmt, nu gibt nur noch ein prob:

    der will net nur das ergebnis da stehen haben sondern auch den rechenweg

    also x durch y = z + Rest
    z durch y = a + Rest
    ......

    x dual entspicht b dezimal

    so hundert % blick ich bei der funktion auch net so ganz durch.

    und sorry, dass ich die profis hier so nerv, aber programmieren ist net so mein ding, aber da muss ich halt durch 😃



  • 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...


Anmelden zum Antworten