Verwendung von Bitmasken



  • Hallo!

    Ich hab mir gerade ein kleines TestProgramm geschrieben, um Bitmaksen verstehen zu lernen. Leider liefert es überhauüt nicht den Output auf den ich gehofft habe:

    Hier mal das Programm:

    uint8_t testState=0x00000000;
    int testShifter=0x1;
    testState=(testState or testShifter);
    for (int i=0;i<8;i++)
    {
    std::cout << (testShifter & testState) << " ";
    testShifter <<=1;
    }
    std::cout << std::endl;
    testShifter=0x1;
    testShifter <<= 3; // Jetzt will ich das dritte Bit verändern
    testState=(testState or testShifter);
    testShifter=0x1;
    for (int i=0;i<8;i++)
    {
    testShifter <<=1;
    std::cout << (testShifter & testState) << " ";
    }
    std::cout << std::endl;
    

    Der Output auf den ich gehofft habe wär das hier:

    1 0 0 0 0 0 0 0
    1 0 0 1 0 0 0 0
    

    aber gekriegt hab ich nur den:

    1 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0
    

    Habs dann auch mit "|" statt "or" versucht, aber das hat nur das hier ausgeworfen:

    1 0 0 0 0 0 0 0 
    0 0 8 0 0 0 0 0
    

    Hat wer Vorschläge, wie ich meinen WunschOutput doch noch kriegen könnte? 😉
    Würd mich freuen / mir echt weiter helfen!

    Mfg, Lotoreo!



  • Hi,

    beim zweiten Durchgang erhöhst du testShifter bevor du mit dem aktuellen i testest. D.h. du testest testState von 2^1 (=2) bis 2^8 (=256), statt von 2^0 bis 2^7. Die "8" in der zweiten Zeile deiner Ausgabe ist also tatsächlich das Bit, dass du haben möchtest.

    Dann als nächstes möchtest du statt der "8" eine "1" haben.
    Das binäre-Und liefert dir eine "8" weil 0x00001001 & 0x00001000 = 0x00001000 = 8 ist. D.h. du brauchst an dieser Stelle ein if(testShifter&testState>0).

    Dein Code sähe dann so aus:

    uint8_t testState=0x00000000;
    int testShifter=0x1;
    testState=(testState or testShifter);
    for (int i=0;i<8;i++)
    {
    std::cout << (testShifter & testState) << " ";
    testShifter <<=1;
    }
    std::cout << std::endl;
    testShifter=0x1;
    testShifter <<= 3; // Jetzt will ich das dritte Bit verändern
    testState=(testState or testShifter);
    testShifter=0x1;
    for (int i=0;i<8;i++)
    {
    
    std::cout << ((testShifter & testState)?1:0) << " "; 
    /*der tertiäre Operator a?b:c ersetzt ein if(a){b;}else{c;} Konstrukt*/
    testShifter <<=1;
    }
    std::cout << std::endl;
    

    Viele Grüße, Chris



  • DANKE 🙂

    Das mit dem vertauschten cout / shift hat mir mal wieder gezeigt, wie lange man an einem Idiotenfehler sitzen kann 😞 Hab mich so gewundert, wieso sogar die erste 1 verschwunden ist.

    Hm, die einzige Möglichkeit die ich sehe, das 8 in eine 1 zu verwandeln, ist die erste 1 zu setzen, den Wert 3 mal zu shiften, und dann die zweite setzen. Falls wer auf die Schnelle was besseres weiß, wär ich da dankbar! Sonst bau ichs eben so ein 😉

    Danke jedenfalls (!),
    mfg, Florian!



  • Verdammt, kann mich als Gast nicht editieren 😞
    Wirklich Zeit, mich hier anzumelden. Bis dahin aber Sorry wegen dem Doppelpost!

    uint8_t testState=0x0;
    int testShifter=0x1;
    testState|= testShifter;
    testState<<=3;
    testState|= testShifter;
    testShifter=0x1;
    

    macht leider auch eine 8 😞
    Hat da noch wer einen Tipp für mich, wie ich das zu einer 1 mach?



  • Du meinst:

    testState=0x00001001;
    for(i=0;i<8;i++){
        test=testState>>i;
        std::cout<< (test&1) <<" ";
    }
    std::cout<<std::endl;
    

    Ginge natürlich auch - ist vielleicht sogar eleganter als mein obiger Vorschlag.

    for (int i=0;i<8;i++){
    std::cout << ((testShifter & testState)?1:0) << " ";
    /*der tertiäre Operator a?b:c ersetzt ein if(a){b;}else{c;} Konstrukt*/
    testShifter <<=1;
    }



  • Hallo!

    Nein, hatte gehofft, damit den 8ter weg zu kriegen. Weil ich gedacht habe, ich kann mit 0x1 beginnen, dann drei mal shiften, dass ich 1000 habe, und dann wieder mit einem 0x1 oderverknüpfen, um 1001 statt 1008 zu erhalten. Hat aber nicht getan, wie ich es wollte 😞



  • Sorry falls ich dich gerade falsch verstehen sollte, deine Ausgabe "1 0 0 8" steht in der umgekehrten Reihenfolge wie 0x1001. Nach deinem 3er shift hättest du die Ausgabe "0 0 0 8". Die Oder-Verknüpfung 0x1 macht dir daraus die 1008.

    Nochmal allgemein:
    cout gibt dir den Wert(!) des Bits aus (wenn es gesetzt ist), du möchtest aber nur wissen ob das Bit gesetzt ist.


Log in to reply