Binärzaehler



  • @wob 😅 da hast voll kommen recht
    Ist halt normal, für jemand, der noch Anfänger ist, solche Fehler gehören halt dazu



  • Wenn ich von 0 bis 31 Bitnummer auswähle, dann wird es auf 1 gesetzt
    Verstehe den Fehler nicht?

    #include<cmath>
    #include <limits.h>
    
    using namespace std;
    
    int main()
    {
        int einsen=0;
        unsigned int Eingabe=0;
        int n; 
        const int bits_int = sizeof(int)*CHAR_BIT ;
        int feld[bits_int];
        int m;
        cout<<"Geben Sie eine Zahl ein: ";
        cin>>Eingabe;
        cout<<Eingabe<<":";
       
        for (int i=bits_int-1; i >= 0; i--)
        {
            feld[i]=Eingabe%2;
            Eingabe/=2;
        }
        for(int i=0; i<bits_int;i++)
        {
            cout<<feld[i];
            if (feld[i]== 1){
    
            ++einsen;
            if (n==1){
           m= feld[i] &= ~(1 >>n); }//Setzt das n-te Bit auf 0 (AND NOT)
           else if (n==0){
       
            m=feld[i] |=(1 >>n);//Setzt das n-te Bit auf 1
            }
        }
        }
        cout<<'\n'<<"Das Bitmuster hat "<< einsen<<" Einsen.";
                   
                  cout<<'\n'<<"Welches Bit(0-31 von rechts beginnend)soll geandert werden? ";
                  cin>>n;
               if (n>=0 && n<32  ){
    
            
        cout<<'\n'<<"Auf welchen Wert(0 oder 1)soll das Bit gesetzt werden "<<m;
    
            
               }
               
    
    
        return 0;
        
    }
    
    


  • @dooni sagte in Binärzaehler:

    Ist halt normal, für jemand, der noch Anfänger ist, solche Fehler gehören halt dazu

    Aber genau vor diesen Fehler warnt der Compiler.

    @dooni sagte in Binärzaehler:

    n steht für die Bitnummer von 0 bis 31

    Das passt aber nicht zu if (n==1)



  • @dooni Der Compiler warnt sogar noch viel mehr. Du solltest Warnungen wirklich anschalten. Die eine davon hast du ja wohl behoben.

    /tmp$ clang++-7 -Weverything dooni.cpp
    dooni.cpp:35:13: warning: overlapping comparisons always evaluate to true [-Wtautological-overlap-compare]
        if(n>=0 || n <=31){
           ~~~~~^~~~~~~~~
    dooni.cpp:39:1: warning: variable 'val' is uninitialized when used here [-Wuninitialized]
    val |= (1 >>n); // Setzt das n-te Bit auf 1
    ^~~
    dooni.cpp:33:23: note: initialize the variable 'val' to silence this warning
          unsigned int val;
                          ^
                           = 0
    dooni.cpp:35:8: warning: variable 'n' is uninitialized when used here [-Wuninitialized]
        if(n>=0 || n <=31){
           ^
    dooni.cpp:32:11: note: initialize the variable 'n' to silence this warning
         int n;
              ^
               = 0
    3 warnings generated.
    

    Generell: IMMER ERST ALLE WARNUNGEN BEHEBEN, BEVOR DU HIER NACHFRAGST - du bekommst schneller den Fehler und wir brauchen keine offensichtlichen Dinge anzusprechen.



  • @dooni sagte in Binärzaehler:

    m= feld[i] &= ~(1 >>n); }//Setzt das n-te Bit auf 0 (AND NOT)

    Da ist echter Mist.

    Schreibe eine Funktion, die dir ein ìntbinaer ausgibt.

    Diese Funktion kannst du dann nach dem Bitsetzen aufrufe. Dann siehts du ja, was pasiert.

    Ändere die Bits in der Variable *Eingabe.
    Tipp:
    Ist Bit 0 gesetzt, dann ist die Wert ungerade.
    Ist Bit 31 gesetzt dann ist die Zahl negativ (genauer Bit (sizeof(int)*CHAR_BIT-1) )
    (das gilt für die meisten aktuellen Systeme)

    Wenn du schon (sizeof(int)*CHAR_BIT) einsetzt, dann doch bitte überall.



  • @DirkB wenn ich Bitzahl nehme z.b 0100

    Dann habe ich ja n0=0
    n1=0
    n2=1
    n3=0
    Dann soll ja sein wenn n2==1 => n2=0
    Ist das so falsch



  • @dooni feld[i] ist 1 oder 0.
    Da ist nicht viel mit Bitmuster und hat mit dem setzten/löschen von Bits auch gar nichts zu tun.
    feld[] ist eine Hilfskonstruktion, damit du den Wert von Eingabe binaer darstellen kannst.

    Und du solltest n auch erstmal eingeben/einlesen, bevor du versuchst das Bit n zu setzen/löschen.



  • @wob weißt du wie ich diese Funktion bei Debugger einschalten kann



  • @dooni wieso jetzt Debugger?





  • Das Programm funktioniert jetzt
    Ich habe noch eine Frage
    wie kann ich jetzt nach Änderung des Bits zu eine Bitzahl und Dezimalzahl umwandeln?



  • @dooni sagte in Binärzaehler:

    Ich habe noch eine Frage
    wie kann ich jetzt nach Änderung des Bits zu eine Bitzahl und Dezimalzahl umwandeln?

    Dazu müsste man wissen, was du in deinem Programm verbrochen hast.

    Dezimalzahlen oder Binärzahlen sind nur Darstellungen eines Wertes.
    Ob da Dezimal 8 oder Binär 1000 steht, ändert nichts an dem Wert.

    Wenn du den Wert (mit Bitoperationen) geändert hast, kannst du die Zahl einfach ausgeben.
    Wenn du jedoch die Darstellung geändert hast, musst du daraus wieder den Wert berechnen. (Das ist auch der falsche Weg)



  • Ich melde mich wieder,
    es scheint nicht ganz beim Bit änder zu klappen.
    Bei manchen Zahlen funktioniert es und bei manche nicht
    Beim Bits setzen habe ich die Bits Operation verwendet

    #include<cmath>
    #include <limits.h>
    
    using namespace std;
    
    int main ()
    {
        int einsen = 0;
        unsigned int Eingabe = 0;
        int n=0; // Bitnummer.
        const int bits_int = sizeof (int) * CHAR_BIT;
        int feld[bits_int];
        int m=0; //Eingesetzte Bit auf 0 oder 1.
        cout << "Geben Sie eine Zahl ein: ";
        cin >> Eingabe;
        cout << Eingabe << ":";
    
        for (int i = bits_int - 1; i >= 0; i--)
        {
            feld[i] = Eingabe % 2;
            Eingabe /= 2;
        }
        for (int i = 0; i < bits_int; i++)
        {
            cout << feld[i];
            if (feld[i] == 1)
            {
    
                ++einsen;
            }
    
    
            if (n >= 0 && n < 32 && feld[i]==1)
            {
                m=feld[i]&~(1<<n);
            }
    
            if(feld[i]==0)
            {
                m=feld[i]|(1<<n);
            }
    
    
    
        }
        cout << '\n' << "Das Bitmuster hat " << einsen << " Einsen.";
    
        cout << '\n' <<
             "Welches Bit(0-31 von rechts beginnend)soll geandert werden? ";
        cin >> n;
    
        if (n >= 0 && n < 32)
        {
    
    
            cout << '\n' << "Auf welchen Wert(0 oder 1)soll das Bit gesetzt werden "<< m<<endl;
    
    
        }
    
    
        return 0;
    
    }
    
    

    Wäre Dankbar, wenn mir jemand den Fehler erklären könnte



  • @dooni Kommentier doch mal dein Programm

    Schau mal, wo du überall n verwendest und wo es einen sinnvollen Wert hat.

    Du änderst irgendwas in feld (wo das Bittmuster abgelegt ist)
    Du änderst aber nichts an der eigentlichen Zahl, die du eingegeben hast.
    Wo bestimmst du, ob das Bit gesetzt oder gelöscht wird?

    Nutze eigene Funktionen.

    Der Fehler ist, dass du überhaupt nicht weißt, was du da machst.


Anmelden zum Antworten