Binärdarstellung



  • In Computern werden ganze Zahlen im Speicher binär abgelegt. Dabei werden nur die
    Ziffern 0 und 1 verwendet und jede Stelle entspricht einer Zweier-Potenz (ganz hinten 2 0=1).
    Um Binärzahlen von Dezimalzahlen zu unterscheiden, wird oft statt der Ziffer 1 der
    Buchstabe zu benutzt. Beispiel:
    LL0L = 1*23 + 1*22 + 0*21 + 1*20 = 13
    Schreiben Sie ein Programm, das eine positive ganze Zahl einliest und die einzelnen Bits (0
    oder L) nacheinander ausgibt. Benutzen Sie dazu Bit-Operatoren!

    ich verstehe nicht wie ich das Programmieren soll, kann mir da jemand helfen?

    Das ist nicht das einzige Programm was nicht korrekt bei mir läuft, da wäre z.B eine Zahl mit einer Schleife zerlegen, ohne Schleife klappt es, aber mit der Schleife wird es verkehrt angezeigt. Ich versuche jetzt mal die Codierung zu Posten, vielleicht klappt es wenigstens bei diesem Programm.
    Ich habe mal ein Informatik-Student gefragt und er meinte zu mir, er hätte das selbe Problem, also die Zahlen sind verkehrt herum und ja, vielleicht hat jemand von euch eine Lösung. Wie gesagt ohne Schleife KLAPPT ES, ich will es aber mit einer Schleife versuchen. Danke

    #include <iostream> 
    using namespace std;
    
    int main() {
    
        int a;
    
        cout << "Bitte eine dreistellige ganze Zahl eingeben:" << endl; /* wird auf dem Bildschirm ausgegeben*/
        cin >>a; /* Die eingegebene (Tastatur) Werte, werden in den Variablen abgelegt */
    
        while (a) { /*schleife*/
    
          a=a/100;
    
          cout << a % 10 << endl; /*Modulus, Divisionsrest*/
    
            a/=10;
    
       }
    
        return 0;
    }
    

  • Mod

    Deine Erklärung für Zeile 15?

    Um das Problem mit der Reihenfolge zu lösen, gibt es viele Möglichkeiten. Eine sehr einfache Methode wäre, Rekursion anstatt einer Schleife zu benutzen. Andere Möglichkeiten wären:
    a) Zeichenkette zwischenspeichern und umgekehrt ausgeben. Nicht sehr elegant. Ist quasi wie die Rekursionsidee, aber man macht eben alles selber, anstatt dass die Programmlogik das Problem von alleine löst.
    b) Sich eine andere Rechenregel überlegen, die von vorne los geht. Das verursacht aber Zusatzprobleme mit führenden Nullen und mit der Länge der größten anzunehmenden Zahl, die man lösen muss.
    c) Gewiss noch viele andere mehr.

    Wenn du das Problem für die Basis 10 erst einmal gelöst hast, dann ist die Basis 2 genau so zu behandeln. Lass die Bitoperationen dabei erst einmal weg. Wenn es mit % und / läuft, kannst du darüber nachdenken, wie du den gleichen Effekt mittels Bitoperationen erhalten kannst. Bei der Basis 10 mag dies nicht gehen, aber bei der Basis 2 gibt es da gewisse Zusammenhänge, die man ausnutzen kann.



  • also Zeile 15 war um etwas zu testen, das sollte eigentlich weg.



  • SeppJs Vorschläge führen in die Irre. Es sollen Bitoperationen benutzt werden! Damit von 10 auf die Basis 2 zu kommen scheint mir kaum einfach möglich. Am besten ist es, in einer Schleife zu testen, ob das jeweilige Bit gesetzt ist. Die kann dann auch rückwärts laufen.

    int Bytes = sizeof z;  // z = eingelesene Zahl
      int Bits = 8 * Bytes;
      for (int k = Bits - 1; k >= 0; --k) {
        if (BEDINGUNG)) {  // Hier die richtigen Bit-Operationen eintragen,
    // um festzustellen ob Bit k gesetzt ist
          cout << 'L';
        } else {
          cout << '0';
        }
      }
    


  • Fangen wir mal so an: Was für Bitoperationen kennst du denn?


  • Mod

    lieber so! schrieb:

    Damit von 10 auf die Basis 2 zu kommen scheint mir kaum einfach möglich.

    Also ich kenne da eine 1:1 Korrespondenz von "geteilt durch 2" und "modulo 2" zu gewissen Bitoperationen.



  • SeppJ schrieb:

    Also ich kenne da eine 1:1 Korrespondenz von "geteilt durch 2" und "modulo 2" zu gewissen Bitoperationen.

    UND möchtest du diese mitteilen? Oder VERSCHIEBST du das auf später?



  • SeppJ schrieb:

    lieber so! schrieb:

    Damit von 10 auf die Basis 2 zu kommen scheint mir kaum einfach möglich.

    Also ich kenne da eine 1:1 Korrespondenz von "geteilt durch 2" und "modulo 2" zu gewissen Bitoperationen.

    Und wieso ist das "einfach", verglichen mit der Schleife? Zeigen!



  • Wer sagt, dass auf die Schleife verzichtet wird?

    1. Das Programm asu dem ersten Post von Braymann auf Basis 2 umbauen.
    2. Das / und % durch Bitoperationen ersetzen.

    Es ging nie darum, das /10 bzw %10 durch Bitoperationen zu ersetzen.



  • DirkB schrieb:

    Wer sagt, dass auf die Schleife verzichtet wird?

    1. Das Programm asu dem ersten Post von Braymann auf Basis 2 umbauen.
    2. Das / und % durch Bitoperationen ersetzen.

    Es ging nie darum, das /10 bzw %10 durch Bitoperationen zu ersetzen.

    Niemand. Es ging um den Vergleich mit der gezeigten Schleife. Und es gibt einfache und komplizierte Schleifen, verschachtelte usw. Dein Ansatz hat einen Fehler: Er würde nur für nicht-negative Zahlen funktionieren. Es geht aber um ganze Zahlen (Aufgabe lesen)! Ein funktionierendes Gegenbeispiel würde mich überzeugen (in C++, nicht in Andeutungen/Empfehlungen wie oben).



  • Es geht um ganze Zahlen, auch wenn nur positive eingelesen werden sollen. Diese Einschränkung scheint für den Anfänger sinnvoll, blockiert aber den Ansatz auch für Zahlen < 0.


  • Mod

    lieber so! schrieb:

    Diese Einschränkung scheint für den Anfänger sinnvoll,

    Dann weißt du ja auch, warum das für den Anfänger sinnvoll ist.

    Deine Lösung hat nämlich 3 Nachteile, von denen ich in meinem Beitrag bereits 2 erwähnte:
    -Man muss wissen, wie lange die Zahl maximal sein kann. Das ist mit sizeof zufriedenstellend gelöst. Aber wenn du schon so penibel bist, auf alle möglichen Erweiterungen zu bestehen, dann geht der Algorithmus schief, wenn der Datentyp ein Integer mit beliebiger Länge wird.
    -Das Problem mit den führenden Nullen ist noch ungelöst und für Anfänger zwar lösbar, aber nicht schön.
    -Die zu benutzenden Bitoperationen sind meiner Ansicht nach für Anfänger wesentlich schwieriger nachzuvollziehen. Ich möchte aber ungern ins Details gehen, da es die Lösung verraten würde. Bei der von mir vorgeschlagenen Lösung kommt es hingegen zu der Erkenntnis, was Bitverschiebung mathematisch bedeutet, was später sicherlich noch nützlich ist. Bei deiner Lösung kommt es zu der Erkenntnis, wie man Bitmasken erstellen kann. Sicherlich auch sehr nützlich, aber ein fortgeschritteneres Thema, zu dem man erst einmal das mathematische Verständnis der Bitoperation haben sollte.

    Außerdem habe ich ausdrücklich erwähnt, dass es viele Methoden gibt und deine sogar explizit aufgezählt mit Vor- und Nachteilen. Ich verstehe überhaupt nicht, wieso du hier von Irreführung sprichst. Unverständnis oder absichtlich Unruhestiftung?



  • deine Argumente leuchten ein. Zur "Irreführung": Ich nahm an, dass der Schwerpunkt der Aufgabe eben gerade die Bitoperationen sind und sah deinen Weg deshalb als überflüssigen Umweg an. Wenn man sich dem Problem Bitoperatoren erst nach und nach nähern soll, wie für lernende zu empfehlen, ist das aber doch wohl sinnvoll.


Log in to reply