Dual Dezimal Umwandlung C-Programm



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



  • deadlef ich glaube das wars, werds dann gleich mal in mein progi einbauen, aber denke genau so funzt das 😃



  • hab scho wieder ein neues problem 🙂

    und zwar:

    ich würde gern eine dualzahl einlesen (oder auch normal zahl is egal)
    das ganze soll in ein array gehen und zwar dass das bit 1 der dualzahl ( oder halt die erste ziffer) auf index 0 des arrays kommt das zweite bit auf index 1....

    leider geht das mit scanf irgendwie net, gibts da irgend einen befehl wie ich c sagen kann, les bit 1 ein und speicher auf index 0.

    das ganze soll aber jetzt net so sein, dass der unser erst bit 1 eingeben muss dann enter drücken, dann bit 2... sondern der gibt normal seine dualzahl ein und nach enter wird pro index ein bit gespeichert.

    ich weiss, dass ganze kann man auch durch zahlenschieberrei lösen, aber ich will nur wissen obs da gleich nen befehl dafür gibt.



  • Hallo Wandiii,

    hast du das programm schon zum funktionieren gebracht?

    Könntest du bitte den gesamten quellcode posten?

    Oder schicken : fokkus@gmx.de

    Wäre nett von dir, denn ich bräuchte das programm auch.

    Gruß Fokkus



  • noch net so ganz, hab mir erst mal einen tag auszeit genommen, da ich das ganze irgendwie von der falschen seite angegangen bin 🙂


Anmelden zum Antworten