Bits lesen/setzen



  • u8 ist lediglich ein typedef auf unsigned char.

    newValue ist ein unsigned char und kein bool, weil ich mit einem Boolean die Bitweise verschiebung nicht durchführen könnte, oder?

    Ich weis nicht, wie ich die Richtigen masken mit den angaben die ich in der Funktion kriege "errechnen" lassen soll.



  • Zu deiner Get-Funktion:

    Das "bitNum-1" ist Quatsch. Damit bist du inkonsistent zu deiner Set-Funktion. Lasse es ruhig nullbasiert. Das 1er-Bit ist also das nullte. Außerdem hat Hacker recht, hier macht u8 nicht überall Sinn. Die Rückgabe von der Get-Funktion sollte bool sein, denke ich. Du willst ja schließlich wissen, ob das Bit gesetzt ist. Wenn bei dir Bit 2 gesetzt ist, kriegst du nicht 1 oder true, sondern 4 zurück. Macht wenig Sinn.



  • Komisch. Mein Compiler spuckt aus, u8 gibt's garnich.

    bool getBit(int bitNum, unsigned char variable)
    {
        return variable & (1 << bitNum-1);
    }
    
    void setBit(unsigned char& Variable, int bitNum, unsigned char newValue)
    {
        Variable |= newValue<<bitNum;
    }
    

    Setbit soll doch setzen?



  • Weils uint8_t heißt. Aber er kann ja auch z.B. selber typedef'n.



  • _matze schrieb:

    Zu deiner Get-Funktion:

    Das "bitNum-1" ist Quatsch.

    Nö.

    Damit bist du inkonsistent zu deiner Set-Funktion.

    Ja.

    Außerdem hat Hacker recht, hier macht u8 nicht überall Sinn. Die Rückgabe von der Get-Funktion sollte bool sein, denke ich. Du willst ja schließlich wissen, ob das Bit gesetzt ist. Wenn bei dir Bit 2 gesetzt ist, kriegst du nicht 1 oder true, sondern 4 zurück. Macht wenig Sinn.

    Kommt ganz auf deine Anwendung an.



  • Hacker schrieb:

    Komisch. Mein Compiler spuckt aus, u8 gibt's garnich.

    bool getBit(int bitNum, unsigned char variable)
    {
        return variable & (1 << bitNum-1);
    }
    
    void setBit(unsigned char Variable, int bitNum, unsigned char& newValue)
    {
        Variable |= newValue<<bitNum;
    }
    

    Setbit soll doch setzen?

    Und was passiert bei deinem Code wohl, wenn ich für newValue 35 angebe?



  • Geeditet 😃



  • Michael E. schrieb:

    _matze schrieb:

    Zu deiner Get-Funktion:

    Das "bitNum-1" ist Quatsch.

    Nö.

    Damit bist du inkonsistent zu deiner Set-Funktion.

    Ja.

    Ok, von mir aus: die dadurch erzeugte Inkonsistenz ist Quatsch. 🙄 Aber irgendwas ist Quatsch, ganz sicher! 😃



  • Also, ich habe jetzt folgenden Code:

    bool RegisterSet::getBit(int bitNum, u8 variable)
    {
    	return variable & (1 << bitNum-1);
    }
    
    void RegisterSet::setBit(u8 *Variable, int bitNum, u8 newValue)
    {
    	*Variable |= newValue<<bitNum;
    }
    

    Die getBit Funktion funktioniert schonmal, nur "falsch herum".
    Wenn ich Bit 7 abfrage kriege ich Bit 2.
    Die setBit Funktion arbeitet leider immernoch nicht korrekt.



  • Was benutzt du den Zeiger?
    Hascht du nix gelernt?
    Zeiger nur so wenig wie möglich benutzen. Lieber Referenzen.



  • Hacker schrieb:

    Was benutzt du den Zeiger?
    Hascht du nix gelernt?
    Zeiger nur so wenig wie möglich benutzen. Lieber Referenzen.

    Hier finde ich Zeiger auch besser.



  • wieso?



  • Habs fertig:

    void setBit(unsigned char& Variable, int bitNum, bool newValue)
    {
        Variable = Variable ^ 1 << bitNum;
    }
    

    Test:

    setBit(a, 5, 0);// a ist 57, ergebnis: 25
    //[..]
    setBit(a, 5, 1);//a is wida 57
    


  • Bloß schrieb:

    wieso?

    Weil ich beim AUfruf

    setBit(&a,5);
    

    am & sofort sehe, daß a verändert werden könnte.
    Das hilft mir bei der Fehlersuche.



  • Ich bin für die Referenz, da es keinen Sinn macht, einen Nullzeiger zu übergeben.



  • Hmm volkard...
    ich glaub sogar, es soll verändert werden - nicht nur weil die Funktion 'set' im Namen trägt 😉
    Ein hoch auf die transzendente Zahl!



  • Habs ausprobiert:

    bool RegisterSet::getBit(int bitNum, u8 variable)
    {
    	return variable & (1 << bitNum-1);
    }
    
    void RegisterSet::setBit(u8 *Variable, int bitNum, bool newValue)
    {
    	*Variable = *Variable ^ newValue<<bitNum;
    }
    
    u8 test = 64;
    theSet->setBit(&test, 6, 1); // Sollte Bit 6 auf 1 setzen -> 00000010 -> 00000110
    bool theBit = theSet->getBit(&test, 7); // test = 0 | theBit = 0
    

    Irgendwas läuft schief :S



  • Hacker schrieb:

    Hmm volkard...
    ich glaub sogar, es soll verändert werden - nicht nur weil die Funktion 'set' im Namen trägt 😉

    Ich erkenne es sogar bevor ich den Namen der Funktion überhaupt lese.
    Und einen Zeiger zu übergeben heißt natürlich nicht, daß man 0 übergeben dürfte.



  • AHHH nein zähl von rechts, sowie der Computer und PI..



  • template <typename T>
    bool getbit(T& var, std::size_t bitnum)
    {
        return var & (1 << bitnum);
    }
    
    template <typename T>
    void setbit(T& var, std::size_t bitnum, bool value)
    {
        var = (var & ~(1 << bitnum)) | (value << bitnum);
    }
    

    Ungetestet.

    Edit: Könnte nun eher stimmen.


Anmelden zum Antworten