Bits löschen
-
Hallo.
Eine Klasse hat eine __int8, die sie zum Speichern von Statusbits verwendet.
Dazu habe ich verschiedene Funktionen geschrieben um die bits zu setzen(einfach logisch oder), un zu löschen.void removestatusbits(__int8 loeschbits) { __int8 maske;//Bits, die beibehalten werden maske = loeschbits ^ 255;//maske = umgekehrte loeschbits statusbits &= maske; }
Ich erhalte aber manchmal falsche Ergebnisse, liegt das an dieser Funktion?
Oder stimmt da alles?
Danke.
-
müsste eigentlich so gehen. einfacher wäre vielleicht:
#define removestatusbits(loeschbits) (statusbits &= ~(loeschbits))
-
Die Variante mit dem Makro ist eigentlich sehr elegant. Aber ich will Dir verraten wie ich das mit einer Funktion machen würde.
Anhand deiner Funktion nehme ich jetzt an, das die Variable statusbits global angelegt ist, ansonsten macht sie keinen Sinn. Wenn Du die global behalten willst, dann würde ich das so machen:void removestatusbits(__int8 loeschbits) { statusbits &= (~loeschbits); }
Ich persönlich würde die Variable statusbits allerdings nicht global anlegen, weil das immer risiken birgt und schnell unübersichltich werden kann (villeicht auch nur ein Knacks in meinem Hirn
Jetzt ergeben sich für mich zwei Varianten für die Funktion. Zuerst die Variante "call by value":__int8 removestatusbits(__int8 statusbits, __int8 loeschbits) { return(statusbits & (~loeschbits)); }
Diese Funktion würde jetzt die zu löschenden Bits in statusbits löschen und das ergebnis mit dem return zurückliefern.
Hier die Variante mit "call by reference". Sie hat den Vorteil, dass sie die Bits in der variable statusbits direckt löscht und Du damit keinen return hast, denn Du wieder zuweisen musst.
removestatusbits(__int8 *statusbits, __int8 loeschbits) { *statusbits &= (~loeschbits); }
mfg
Sputnik
-
Ja danke
.
statusbits ist nicht global, das alles ist Klassenintern, ich habs nur zur Vereinfachung so geschrieben.