Bit Operation (OR) Einzel Bit setzen!



  • Guten Tag erst einmal 🙂

    Ich habe eine Frage bezüglich des Setzens von Bits, dabei benutze ich auch inline Assembler und Bitoperationen.
    Zum Hintergrund: Schreibe an einer Byte Klasse, die auch ein paar Funktionen beinhalten soll, darunter fällt auch, das setzen von einzelnen Bits in dem Byte-Objekt.

    void Byte::setBit(unsigned char bitNo)
    {	 // Wenn Bit schon gesetzt ist, passiert nichts!
    	 /* 8 Mögliche Bit Kombis
    	    1000 0000 128 --> 0x80
    	    0100 0000 64  --> 0x40
    		 0010 0000 32  --> 0x20
    		 0001 0000 16  --> 0x10
    		 0000 1000 8   --> 0x08
    		 0000 0100 4   --> 0x04
    		 0000 0010 2   --> 0x02
    		 0000 0001 1   --> 0x01
    	 */
    	 unsigned char bitPattern = 0x01;
    	 // links-shift um die bitNr. s.o.
    	 bitPattern = bitPattern << bitNo;
    	 std::cout << "bNumber:   " << (int)bNumber << std::endl;
    	 std::cout << "bitPattern: " << (int)bitPattern << std::endl;
    	 unsigned char tmp = 0;
    
    	 __asm {
    		  MOV al, bNumber;
    		  OR al, bitPattern;
    		  MOV tmp, al;
    	 }
    	 bNumber = tmp;
    	 std::cout << "bNumber:   " << (int)bNumber << std::endl;
    }
    

    Das Problem: Als Beispielwert habe ich bitNo = 4 gesetzt und bNumber = 32.
    Daraus folgt dann, dass bitPattern == 16 ist. So weit so gut.
    Jetzt kommt es zu dem asm-code. Meiner Meinung nach müsste 32 OR 16 = 48 ergeben. Doch bei der Ausgabe sagt er mir, "bNumber: 16".

    Hat einer von euch eine Idee und kann mir mit Rat und Tat zur Seite stehen?

    Viele Grüße an alle 😕



  • Hi Kronos_m,

    wieso willst Du das mit Inline-Assembler machen?
    C(++) bringt die nötigen Operatoren doch schon alle mit. Ein 'bitweises oder' erreichst Du mit '|' (ohne die Anführungszeichen), ein 'bitweises und' mit '&', ein 'bitweises negieren' mit '~'.

    Deine ganze Funktion wird damit zu

    void Byte::setBit(unsigned char bitNo)
    {
        bNumber |= (1 << bitNo);
    }
    

    Ein Rücksetzen würde so aussehen:

    void Byte::resetBit(unsigned char bitNo)
    {
        bNumber &= ~(1 << bitNo);
    }
    

    Würde sagen, das ist etwas kürzer 🙂

    Viele Grüße



  • 👍 Ich bin spontan begeistert 😃

    Super, ich danke dir. Das ist natürlich simpel. Und es funktioniert, habe es gerade getestet.
    Trotzdem merkwürdig, dass der Umweg über inline Assembler nicht so läuft!

    Danke...

    Viele Grüße


Anmelden zum Antworten