Bits lesen/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ägtIch 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 jetztemplate <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.