Binärzaehler



  • @DirkB ok

     cout<<feld[i]<<'\n';
    
    

    das habe ich verwendet, tut daselbe



  • @dooni habs heraus bekommen



  • @dooni sagte in Binärzaehler:

    @DirkB ok

     cout<<feld[i]<<'\n';
    
    

    das habe ich verwendet, tut daselbe

    Nein, nicht dasselbe. den Unterschied bemerkst du nur nicht


  • Gesperrt

    Voll krass, Jungs. Die Aufgabenstellung "Binärzähler" ist weitaus weniger trivial, als um was es hier inzwischen geht, nämlich wie man C++ in den Griff kriegt. Made my day. 😀



  • Die Aufgabe soll jetzt erweitert werden und zwar die Bits einsetzen
    Ich habe die beiden Varianten verwendet
    val |= (1 >>n); // Setzt das n-te Bit auf 1
    val &= ~(1 >> n); //Setzt das n-te Bit auf 0 (AND NOT)
    Ich habs versucht umzusetzen, aber klappt nicht

    #include<iostream>
    #include<cmath>
    #include <limits.h>
    
    using namespace std;
    
    int main()
    {
        int einsen=0;
        unsigned int Eingabe=0;
    
        const int bits_int = sizeof(int)*CHAR_BIT ;
        int feld[bits_int];
        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;
            }
            }
    
            cout<<'\n'<<"Das Bitmuster hat "<< einsen<<" Einsen.";
         int n;
          unsigned int val;
    
        if(n>=0 || n <=31){
             cout<<'\n'<<"Welches Bit(0-31 von rechts beginnend)soll geandert werden? ";
            cin>>n;
            if (n==0){
    val |= (1 >>n); // Setzt das n-te Bit auf 1
    
    if (n==1){
    val &= ~(1 >> n); //Setzt das n-te Bit auf 0 (AND NOT)
    
    }
    }
            cout<<"Auf welchen Wert(0 oder 1)soll das Bit gesetzt werden "<<val;
    
            
    
        }
    
    
        return 0;}
    
    


  • @dooni schalte den Warnlevel bom Compiler auf Maximum.
    Beachte die Warnungen und behebe deren Ursache.

    Wofür steht n?



  • @DirkB sagte in Binärzaehler:

    schalte den Warnlevel bom Compiler auf Maximum.

    👍 !!!

    Und dann formatiere deinen Code anständig! Das sollte jeder gute C++-Editor automatisch können - und wenn nicht, dann nimm am besten clang-format. In deinem Code hat man ja überhaupt keinen Überblick, was wo aufgerufen wird.



  • @DirkB sagte in Binärzaehler:

    schalte den Warnlevel bom Compiler auf Maximum.

    n steht für die Bitnummer von 0 bis 31
    meinst du int nmax=31;
    int nmin=0;



  • Du hast doch schon alles in feld stehen. Wenn du stattdessen val nehmen möchtest, müsstest du val direkt nach dem Lesen von Eingabe initialisieren (Eingabe wird ja anschließend verändert).
    Allerdings stimmt schon deine Erklärung zum Bitsetzen/Bitlöschen nicht, da 1 jeweils um n Stellen nach links verschoben werden müsste.



  • @dooni sagte in Binärzaehler:

    n steht für die Bitnummer von 0 bis 31

    Du möchtest vielleicht gerne, dass n dafür steht, aber dein n ist uninitialisiert.

         int n;
    (...)
        if(n>=0 || n <=31){
             cout<<'\n'<<"Welches Bit(0-31 von rechts beginnend)soll geandert werden? ";
            cin>>n;
    
    

    ist doch offensichtlich nicht richtig. Erst n vergleichen, dann n einlesen?



  • @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?




Anmelden zum Antworten