Bitveränderung



  • Hallo, es handelt sich bei dem folgenden Code um ein Programm welches bei einer eingegebenen Zahl das Bitmuster ausgibt und ausgibt wie viele Einsen im Muster vorkommen. Des Weiteren kann man ein Bit im Bitmuster auswählen. Darauf wird angezeigt, ob es sich um eine 1 oder eine 0 handelt. Danach kann man entscheiden, ob das Bit invertiert werden soll. Hier nun der Code:

    
    #include <iostream>
    
    using namespace std;
    
    int main() {
    
        unsigned int zahl=0;
        int anzahl=0;
        int stelle=0;
    
        cout << "Geben Sie eine Zahl ein:" <<endl;
        cin >> zahl;
    
        for ( int i = 0 ; i < sizeof (zahl) *8-1 ; i++ )
        {
            if( (zahl>>i) & 1 )
            {
                anzahl = anzahl+1;
    
            }
        }
            cout << "Anzahl der Einserstellen:" <<anzahl << endl;
    
    
        cout << "Ihre eingegebene Zahl"  << zahl <<  "als Binaercode:" <<endl;
    
        for (int i = sizeof (zahl)*8-1 ; i >= 0; i--)
        {
            if ((zahl >> i) & 1)
            {
                cout << "1";
            }
            else
            {
                cout << "0";
            }
        }
    
        cout << endl << endl;
    
        cout << "Welche Stelle ihrers Binaercodes soll geaendert werden?";
        cin >> stelle;
    
        stelle--;
        bool stellenveraendern=0;
    
        if (stelle >= 0 && stelle <= sizeof(zahl)*8)
        {
             if ( (zahl & (1<<stelle)) > 0)
             {
                 cout << "Das ausgewaehlte Bit war eine 1" << endl;
                 cout << "Moechten Sie die Stelle invertieren?" << endl;
                 cin >> stellenveraendern;
                 cout << endl;
                 zahl = zahl & (~(1<<(stelle)));
                 if( stellenveraendern > 1)stellenveraendern = 1;
    
    
             }
             else
             {
                 cout << "Das ausgewaehlte Bit war eine 0." << endl;
                 cout << "Moechten Sie die Stelle invertieren?" << endl;
                 cin >> stellenveraendern;
                 zahl = zahl | (1<<(stelle));
                 if( stellenveraendern > 1)stellenveraendern = 1;
    
             }
        }
    
        if (stellenveraendern)
        {
             for (int i = sizeof(zahl)*8-1; i >= 0; i--)
             {
                  if ((zahl >> i) & 1)
                  {
                      cout << "1";
                  }
                  else
                  {
                       cout << "0";
                  }
             }
        }
    
         if (stellenveraendern)
         {
             cout << "Die Zahl nach der Invertierung lautet: " << endl <<endl;
             cout << zahl;
         }
         else
         {
             cout << "Die Zahl ist weiterhin eine " << zahl << "." << endl;
         }
    
         return 0;
    }
    
    

    Ich habe hierbei folgendes Problem bei der Veränderung des ausgewählten Bits: Wenn es sich bei meinem Bit um eine 1 handelt und ich es NICHT ändern möchte wird mit trotzdem die veränderte Zahl ausgegeben. Wenn es sich um eine 0 handelt und ich es verändern möchte passiert nichts. Hat jemand vielleicht eine Idee woran das liegen könnte? ^^
    Beste Grüße



  • Was gibst du denn bei "Moechten Sie die Stelle invertieren?" in der Konsole ein?
    Solange boolalpha nicht gesetzt ist, wird nur 0 oder 1 als gültige Werte erkannt, alles andere führt zum Setzen des failbit, s.a. Cin and Boolean input.

    PS: Daher macht auch if( stellenveraendern > 1)stellenveraendern = 1; keinen Sinn. 😉



  • Ich gebe eine 1 für "Ja" und eine 0 für "Nein" ein. Mit: "if( stellenveraendern > 1)stellenveraendern = 1;" möchte ich nur verhindern dass ein anderer Wert als 0 oder 1 eingegeben werden kann.



  • @bigBabo sagte in Bitveränderung:

    Mit: if( stellenveraendern > 1)stellenveraendern = 1; möchte ich nur verhindern dass ein anderer Wert als 0 oder 1 eingegeben werden kann.

    Erstens steht dieses if-Statement nach dem Einlesen eines Wertes in stellenveraendern, also kannst Du damit überhaupt nichts mehr verhindern, zweitens kann ein boolean zwei Werte haben: 0 oder 1, somit ist es sowieso sinnlos. Prüfe die Flags des Streams.



  • @bigBabo Ein paar cout zwischendurch, mit denen du gerade berechnete Werte ausgibst, sind ganz hilfreich.
    Besser ist der Debugger.



  • Die Logik in deinem Programm paßt auch nicht, denn du änderst ja in den Zeilen 56 und 66 immer die Variable zahl, unabhängig von der Eingabe.

    PS: Bei einem bool solltest du Zuweisungen mit true und false benutzen (anstatt 0 oder 1):

    bool stellenveraendern = false;
    

    Ansonsten müßtest du einen anderen Datentyp für die Eingabe verwenden (z.B. char) und diesen passend abfragen (z.B. 'j'oder 'n').


Log in to reply