C Binär in Dezimal

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

  • C Binär in Dezimal

    Kann mir jemand sagen wir ich mit C es hinbekomme eine binär Zhal in eine Dezimal zuwandeln ???

    Ich möchte das der Benutzer die binäre Zahl ein gibt und das Programm diese umwandelt in eine Dezimalzahl!

    Hab mir schon gedanken gemacht! Weiß aber nicht wie ich die einzelnen Stellen aus der binären Zahl rausbekomm.
  • SeBa schrieb:

    Mit modolo 10 bekommst immer genau die letze Ziffer der Zahl.


    Das Problem mit deiner Methode ist, dass es schon bei relativ kleinen Dualzahlen schluss ist, da die dann ja in rießigen dezimalzahlen abgebildet werden.

    Andere Lösung:
    Eingabe in einen std::string und dann per schleife (reverse_iterator?) von hinten nach vorne char für char durchgehen, lesen ob '1' oder '0' und bei jeden durchlaf den multiplikator mit 2 multiplizieren:

    Quellcode

    1. #include <iostream>
    2. #include <string>
    3. int main()
    4. {
    5. std::string binaer;
    6. int erg = 0;
    7. int mult = 1;
    8. std::cin >> binaer;
    9. for (std::size_t idx = binaer.size()-1; idx >= 0; idx--=
    10. {
    11. if (binaer[idx] == '1')
    12. {
    13. erg += mult;
    14. }
    15. erg *= 2;
    16. }
    17. }
    Alles anzeigen


    Wenn es C ohne ++ sein soll müsste man halt mit CStrings arbeiten, geht aber eigentlich auf die gleiche Weise, man muss nur das '\0' finden ind die position dann in der schleife statt size() verwenden.
    There are only 10 types of people in the world: Those who understand binary, and those who don't.

    Download meines ersten Spiels:HIER
    Über Feedback würde ich mich freuen ;)
  • Quellcode

    1. #include <stdio.h>
    2. int main()
    3. {
    4. char binaer[255];
    5. getline(stdin, binaer, 255);
    6. printf("test!");
    7. size_t size;
    8. int erg = 0;
    9. int mult = 1;
    10. size_t idx;
    11. for (idx = 0; idx < 255; idx++)
    12. {
    13. if (binaer[idx] == '\0')
    14. {
    15. size = idx;
    16. break;
    17. }
    18. }
    19. for (idx = size-1; idx >= 0; idx--)
    20. {
    21. if (binaer[idx] == '1')
    22. {
    23. erg += mult;
    24. }
    25. erg *= 2;
    26. }
    27. printf("%d", &erg);
    28. }
    Alles anzeigen


    Bringt mir noch ein Segmentation Fault, aber das Prinzip würde ich verwenden.

    EDIT://
    Ein Fehler ist das getline() das, wie ich gerade sehe auch gar kein ANSI-C ist.

    EDIT://
    Jetzt gehts, size_t ist ja unsigned, da bringts nichts auf >= 0 zu testen:

    Quellcode

    1. #include <stdio.h>
    2. int main()
    3. {
    4. char binaer[128];
    5. size_t idx;
    6. scanf("%s", binaer);
    7. size_t size;
    8. int erg = 0;
    9. int mult = 1;
    10. for (idx = 0; idx < 100; idx++)
    11. {
    12. if (binaer[idx] == '\0')
    13. {
    14. size = idx;
    15. break;
    16. }
    17. }
    18. if (!size) return;
    19. for (idx = size-1; idx < 500; idx--)
    20. {
    21. if (binaer[idx] == '1')
    22. {
    23. erg += mult;
    24. }
    25. mult *= 2;
    26. }
    27. printf("%d", erg);
    28. }
    Alles anzeigen


    Wobei die 500 ein willkürlicher Wert sind. (nur größer als der amximale string)
    There are only 10 types of people in the world: Those who understand binary, and those who don't.

    Download meines ersten Spiels:HIER
    Über Feedback würde ich mich freuen ;)
  • "darthdespotism" schrieb:

    Das Problem mit deiner Methode ist, dass es schon bei relativ kleinen Dualzahlen schluss ist, da die dann ja in rießigen dezimalzahlen ab
    gebildet werden.

    Versteh ich nicht.

    Das in einen String zu schreiben und den dann auszulesen macht überhaupt keinen Sinn und man verschwendet massiv Rechenleistung für etwas, was du eigentlich gar nicht willst. Das alles um nicht nachdenken zu müssen? Grausam!
    ~ 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]
  • Du willst Dualzahlen in Dezimale umwandeln und nimmst int:

    Jetzt versuchst du

    110100110010 umzuwandeln, ist ja nur 3378. Wenn du jetzt aber beispielsweise so an die Zahl kommen willst:

    Quellcode

    1. int i;
    2. scanf("%d", &i);


    wirst du feststellen, dass die Dualzahl bereits viel zu groß für deinen int ist. Du kannst jetzt unsigned int verwenden, long oder gar unsigned long, aber damit verschiebst du das Problem nur.

    Mit einem char bin[31] hast du genug platz um jede binärzahl, die sich in einen int umwandeln lässt zu speichern.
    There are only 10 types of people in the world: Those who understand binary, and those who don't.

    Download meines ersten Spiels:HIER
    Über Feedback würde ich mich freuen ;)
  • Wenn der die Eingaben sowieso von stdin oder argv ließt isses eh ein String und muss sowieso konvertiert werden. Aber um eine Zahl zu zerlegen in einen String zu wandeln ist definitiv immer der falsche Weg. Ich würde Zahlen auch immer nur gemäß ihrem realen Wert speichern, alles andere sind nur unterschiedliche Repräsentationen.
    ~ 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]