Bits lesen/setzen



  • _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.



  • Wollt ich auch mit Templates machen.. 😡

    @PI 😕 😕 😕 Wie kommst du auf diese Setter-Funktion? Kann nur falsch sein.



  • Ist mir auch gerade aufgefallen, ich korrigiere gerade.



  • Ämm guck grad
    sa mal, wie heißt du eig. im IRC?

    Edit: is korrekt, meine art is aber cooler
    so jetz

    template <class T>
    inline void setbit(T& var, std::size_t bitnum, bool value)
    {
        var = var ^ 1 << bitNum;;
    }
    

    Ne, is falsch - korrigier grad
    Edit: Ne, bleiben wir bei PI's funktion.



  • Hacker schrieb:

    @PI 😕 😕 😕 Wie kommst du auf diese Setter-Funktion? Kann nur falsch sein.

    Wieso?

    EDIT: Ach deswegen. 😃
    EDIT2: Hat für mich im ersten Moment auch Sinn gemacht. Ich war wohl zu lange auf der Arbeit. 😃


Anmelden zum Antworten