C - Programmierung: Dualdarstellung

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • C - Programmierung: Dualdarstellung

    Hallo Zusammen!!

    Also am Montag steht die Klausur an... und deswegen habe ich hier noch eine Aufgabe, die ich zu lösen versuche und daran scheitere, eine Zahl in der Dualdarstellung auszugeben...

    Aufgabe: Schreiben Sie eine Funktion udual(), die die Dualdarstellung einer positiven ganzen Zahl mit Hilfe von printf() in umgekehrter Reihenfolge ausgibt.
    Beispiel: udual(6) soll 011 ausgeben. udual(13) soll 1011 ausgeben.



    Kann man das nicht auch irgendwie mit einer rekursiver Funktion lösen??

    Vielen Dank im Voraus für Eure Antworten.

    Gruß,
    belomor
  • Also ich habs selbst versucht und bin zu folgendem Ergebnis gekommen:

    Quellcode

    1. void udual(int n)
    2. {
    3. int rest;
    4. if(n != 0) {
    5. rest = n%2;
    6. printf(" %d", rest);
    7. }
    8. if(n != 0) {
    9. udual(n/2);
    10. } else {
    11. printf("\n\nENDE\n\n");
    12. }
    13. }
    Alles anzeigen


    Es funktioniert! Wenn jemand Optimierungsvorschläge hat, schreibt mir bitte.

    Als nächstes soll Binärdarstellung in der richtigen Reihenfolge erfolgen... Kann dabei jemand helfen???

    Gruß,
    belomor
  • Wenn du das schon rekusriv machst, dann solltest du auch davon profitieren:

    Quellcode

    1. void udual(int n)
    2. {
    3. int rest;
    4. if(n != 0) {
    5. udual(n/2);
    6. } else {
    7. printf("\n\nENDE\n\n");
    8. }
    9. if(n != 0) {
    10. rest = n%2;
    11. printf(" %d", rest);
    12. }
    13. }
    Alles anzeigen


    Das sollte dann nämlich in der richtigen Reihenfolge sein.
    ~ mfg SeBa

    Ich beantworte keine PMs zu Computer-/Programmierproblemen. Bitte wendet euch an das entsprechende Forum.

    [Blockierte Grafik: http://i.creativecommons.org/l/by-sa/3.0/80x15.png]
  • Ich habe es ehrlich gesagt nicht getestet, aber guck doch mal was ich nur geändert hab. Die Ausgabe der aktuellen Zahl ist erst nach dem rekursiven Aufruf, das heißt zuerst der letzte Aufruf der Rekursionmacht seine Ausgabe, danach der Vorletzte und so weiter. Probiers mal aus.
    ~ mfg SeBa

    Ich beantworte keine PMs zu Computer-/Programmierproblemen. Bitte wendet euch an das entsprechende Forum.

    [Blockierte Grafik: http://i.creativecommons.org/l/by-sa/3.0/80x15.png]
  • die minimalisten version:


    Quellcode

    1. void udual(int n)
    2. {
    3. do
    4. putc(n & 1 ? '1' : '0',stdout);
    5. while (( n = n >> 1));
    6. putc('\n',stdout);
    7. }


    Erklährung für die Ungeübten:

    n & 1 bedeutet "gib mir das tiefste bit von n" (sowas wie n % 2)

    z = x ? a : b bedeutet das gleiche wie

    Quellcode

    1. if(x)
    2. z= a;
    3. else
    4. z = b;


    n = n >> 1 bedeutet die Zahl n um ein bit nach rechts verschieben. Oder anders gesagt durch zwei teilen und den rest (ein halbes bit?) fortwerfen.

    also wir lesen das niedrigste bit, schreibens als character raus und schieben. Und das tun wir solange wir nach dem shiften noch bits haben.

    Viel kompakter gehts nicht mehr.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von kiwi66 ()

  • Als nächstes soll Binärdarstellung in der richtigen Reihenfolge erfolgen... Kann dabei jemand helfen???


    Wie währs damit

    Quellcode

    1. void udual(int n)
    2. {
    3. int doprint;
    4. int bit;
    5. int i;
    6. i = (sizeof(int)*8) - 1; /* i ist nun das höchste bit eines integers. Also meist 31 für 32bit CPU's */
    7. doprint = 0; /* wenn wir noch keine 1 gesehen haben, unterdrücken wir die führende 0, ausser es gibt nur nullen */
    8. while(i >= 0)
    9. {
    10. bit = (n >> i) & 1; /* gib mir das bit an der stelle i */
    11. if(bit)
    12. {
    13. putc('1',stdout); /* oder in C++ auch cout << '1'; */
    14. doprint = 1;
    15. }
    16. else
    17. {
    18. /* führende Nullen unterdrücken */
    19. if((doprint) || (i==0))
    20. putc('0',stdout);
    21. }
    22. i--;
    23. }
    24. putc('\n',stdout);
    25. }
    Alles anzeigen


    Obiges ist standard C code. Läuft genauso in C++. Die Bitschiebereien sind für Rechnen in der Potenz 2 der Schlüssel. Währe das ganze zur Potenz 3 oder so, dann müsste man nen ganz anderen aufwendigeren weg gehen.