Integer binär ändern



  • Hallo miteinander

    Ich habe von meinem c++ Lehrer folgende Aufgabe bekommen:

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

    Beispiele: Inhalt		Inhalt	  Ergebnis	  Ergebnis
               (Dezimal) 	(Binär)     (Binär)     (Dezimal)
    
               255		  11111111	01001111    247
               123          01111011    11011001    115
               55           00110111    01101011     55
    

    (sorry, ist natürlich kein Code, aber ich konnte es nicht anders darstellen)

    Um die Dezimalzahl abzuändern, müsst ich sie ja wohl binär ausgeben, oder?
    Kann mir jemand erklären, wie man das macht? Oder bin ich völlig auf dem Holzweg?

    Freue mich über jeden Lösungsinput.

    Danke für eure Hilfe

    Grüsse aus der Schweiz, nemico



  • wenn ichs richtig verstanden habe, liegt das problem darin eine dezimalzahl in eine binärzahl umzu wandeln.
    wenn dem so ist: überprüfe ob die zahl größer 128 ist, wenn ja, schreibe eine 1, wenn nein, dann eine 0, dann mach das gleiche bei der hälfte, also mit 64, dann 32, usw, bis 1...

    wenn dem nicht so ist: denk ans beste nirvana album und tus - nevermind 😃



  • ach sooooooo...

    coole Idee!!!! Ich danke dir für dein Posting.
    Werde es gleich mal ausprobieren. Hoffentlich habe ich alles richtig
    verstanden 😃

    Danke und noch nen schönen Abend

    cu

    --> gibt es keine einfachere Methode 😃
    Ich bin wie der Strom. Nehme immer den Weg des geringsten Widerstandes. 😉



  • kein ding,
    ich freu mich auch mal helfen zu können und nicht immer nur selber fragen zu stellen, was bis jetzt immer der fall war 😉



  • Hi,

    ich gehe mal von aus, dass Du das 3.Bit von rechts löschen sollst.
    Reicht es da nicht aus den Bytewert - 4 zu rechnen??? Wenns das 4.Bit
    sein soll dann 8 abziehen usw. Ich werde allerdings aus Deinen Beispielen
    nicht ganz schlau, weil da nicht nur das 3.Bit gelöscht wird...

    Gruß Chris



  • 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