Integer binär ändern



  • oje, sorry
    du hast natürlich recht. Da habe sich einige böse 0/1 Fehler eingeschlichen.
    So wärs richtig:

    11111111 --> 11110111
    01111011 --> 01110011
    00110111 --> 00110111

    Ich bin beim Abtippen auf die nächste Aufgabe verrutscht.

    Du hast wohl schon recht mit der Idee -4 bzw -8 usw.
    Aber in der Aufgabe steht explizit: "..., welches innerhalb einer Speicherzelle (1 Byte) das 3.Bit löscht..."

    Die Ideen sind wohl schön und gut und ich danke euch echt für eure Hilfe. Aber gibt es in c++ keine Möglichkeit eine Integerzahl direkt in eine binäre Zahl umzuwandeln???

    Nochmals Danke für eure Hilfe

    Gruss, Raphael



  • stimmt, bei dieser aufgabe reicht es wirklich, nur das 3.bit zu überprüfen: wenns gleich 1 ist, dann ergebnis=ausgangszahl-4, sonst ergebnis=ausgangszahl.

    die beispiele versteh ich auch nicht ganz...
    so siehts meiner meinung nach richtig aus (habs jetzt im kopf gemacht, kann also doch falsch sein 😉 )

    Beispiele: Inhalt        Inhalt      Ergebnis      Ergebnis
               (Dezimal)     (Binär)     (Binär)       (Dezimal)
    
               255          11111111    11111011       251
               123          01111011    01111011       123
               55           00110111    00110011       51
    

    edit: hmm, war ich mal wieder zu langsam...



  • [cpp]
    
    unsigned char byte;
    
     byte = byte &  0xfb;  // logisches UND mit 11111011 = 0xfb
    // oder kürzer 
     byte &=0xfb;
    
    [/cpp]
    


  • @ Mr. Pink

    Danke für die Korrektur, da waren wir wohl beide gleichzeitig beschäftigt 😉

    Ich glaube dir ist ein Denkfehler unterlaufen. Sorry, soll nicht vorlaut rüberkommen.
    Das 3. Bit ist in diesem Fall die 4. Zahl (v.r.n.l)
    --> n-tes Bit: 7-6-5-4-3-2-1-0

    Ich habe deine Idee vom ersten Posting aufgenommen. Leider funktioniert sie noch nicht ganz. Bei der Zahl 255 bekomme ich wohl die (Test-)Ausgabe 255.
    Doch schon bei 123 klappt es nicht mehr: 123 --> 01111011
    Deine Idee:
    123 < 128 --> 0 okay;
    123/2=61 < 64 --> 0 falsch;
    usw.

    solltest du es so gemeint haben:
    123 < 128 --> 0 okay;
    123 > 64 --> 1 okay;
    123 > 32 --> 1 okay;
    123 > 16 --> 1 okay;
    123 > 8 --> 1 okay;
    123 > 4 --> 1 TILT!!!!!
    123 > 2 --> 1 okay;
    123 > 1 --> 1 okay;

    01111111 = 127
    01111011 = 123

    Ich hoffe, du verstehst was ich meine. Ich weiss langsam nicht mehr weiter... Ich glaube, langsam aber sicher habe isch scho ziemlich alles ausprobiert 😃

    Egal, langsam aber sicher macht mir c++ Spass

    Ich danke euch nochmals für eure Inputs. Dieses Forum und die User sind echt genial!!!!!

    greetz



  • Ich habe mal etwas geschrieben und hoffe Dir damit helfen zu können. Bin selbst noch neu in C++ und hoffe nicht all zu große Fehler gemacht zu haben.
    Probier es einfach aus und wenn Fragen sind frag.

    Gruß Chris

    // C++C++C++C++C++C++C++C++C++C++C++C++C++C++
    // Datei: main.cpp
    // Projekt: das 3.Bit
    // Version: 0.1
    // Datum: 10.04.2006
    // Sprache/Compiler: C++/Code::Blocks v1.0
    // Optionen Compiler: -Os (Optimierung Größe)
    // Optionen Linker: -s (Strip)
    // Autor: justchris
    // C++C++C++C++C++C++C++C++C++C++C++C++C++C++
    
    //  Praeprozessor
    // ===============
    #include <iostream>
    #include <string>
    
    //  PROTOTYPEN
    // ============
    std::string dez2bin(unsigned char byteWert);
    void waitENTER();
    
    // ======
    //  MAIN
    // ======
    int main()
    {
      unsigned char meineSpeicherstelle = 237;
      unsigned char* zeigerAufByte = &meineSpeicherstelle;
    
      unsigned char byteWert = *zeigerAufByte;
    
      std::cout << "byteWert(dezimal) = " << (int)byteWert << std::endl;
      std::cout << "byteWert(dual) = " << dez2bin(byteWert) << std::endl;
    
      std::cout << "3.Bit auf 0 setzen..." << std::endl;
      byteWert&=~4;
    
      std::cout << "byteWert(dezimal) = " << (int)byteWert << std::endl;
      std::cout << "byteWert(dual) = " << dez2bin(byteWert) << std::endl;
    
      std::cout << "Press ENTER to close...";
      waitENTER();
      return EXIT_SUCCESS;
    }
    
    //  IMPLEMENTIERUNGEN
    // ===================
    std::string dez2bin(unsigned char byteWert)
        {
        std::string dualZahl;
        do
          {
          if (byteWert%2)
            dualZahl+="1";
          else
            dualZahl+="0";
    
          byteWert /= 2;
          }
        while (byteWert>0);
        return dualZahl;
        }
    
    void waitENTER()
    {
      std::cin.clear();
      std::cin.ignore(std::cin.rdbuf()->in_avail());
      std::cin.get();
    }
    


  • Ich glaube dir ist ein Denkfehler unterlaufen. Sorry, soll nicht vorlaut rüberkommen.
    Das 3. Bit ist in diesem Fall die 4. Zahl (v.r.n.l)
    --> n-tes Bit: 7-6-5-4-3-2-1-0

    nein !!!

    das dritte Bit ist 00000100 --> es gibt kein "nulltes" bit
    bit 3 ist 00001000 --> Nummerierung 0-7

    Nemico der Fehler ist also dir unterlaufen



  • Schreiben Sie ein Programm, welches innerhalb einer Speicherzelle (1 Byte) das
    3. Bit löscht. Die übrigen Bits sollen ihren Ursprungszustand behalten.

    void killBit3(unsigned char &block)
    {
    	if((block >> 2)%2) block -= 4;
    }
    

    😉



  • als deutscher fange ich übrigens bei 1 an zu zählen. warum sollte das dritte bit dann das an position 4 sein?



  • @ justchris
    Danke viel Mals für deinen Code. Leider verstehe ich im Moment noch kein Wort. Im Vergleich zu mir, bist du alles andere als ein Anfänger (dafür weiss ich nun wieder wo ich stehe...)!!!! 😉

    @ frodo
    Wie gesagt, meine Aussage war wohl etwas waghalsig. Ich habe diese Aussage auch nur augrund der Aufgabenstellung so geschrieben. Denn in der Aufgabenstellung wird (wie du richtig gepostet hast) das Bit 3 (also das 4.Bit) verändert. Ich nehme mal an, dass unser Lehrer dies so schreiben wollte und deshalb hier für allegemeine Verwirrung sorgte. Tut mir leid und danke für die Richtigstellung!

    @ all
    Danke für eure Postings! Ist echt toll, wie ihr euch bemüht mir zu helfen. Ich hoffe, ich kann mich irgendwann mal revanchieren!



  • also nächster Versuch

    [cpp]
    
    unsigned char killbit3(unsigned char block)
    {
      return( block & 0xf7 );  // löscht bit 4
    }
    
    oder  allgemeiner
    
    unsigned char killbit(unsigned char block,unsigned char bitn)
    {
      return( block & (~(1 << bitn)) );
    }
    
    [/cpp]
    

Anmelden zum Antworten