Quote:
Originally Posted by CeLiFiG
Ich glaube ich bin noch ein bisschen zu doof für Bitflags.
|
Angenommen, du hast einige Kekse und möchtest die zählen. Dann fängst du an: 1, 2, 3, ..., 9. Du ordnest also jedem Keks eine Ziffer zu. Wenn du mehr als 9 Kekse hast, gibt es aber ein Problem: Wir haben nur 10 verschiedene Ziffern (0, 1, 2, ..., 9). Deswegen bildest du die nächste Zahl, also die 10, indem du zwei Ziffern kombinierst (also die 1 und die 0).
Irgendwann lernt man in der Schule, dass Ziffern je nach Position in einer Zahl eine andere Bedeutung haben, und gibt den Stellen einen Namen: In der Zahl 1234 nimmt die Ziffer "4" die Rolle der Einer ein, die "3" die der Zehner, die "2" die der Hunderter und die "1" die der Tausender. Wäre die Zahl länger, gäbe es noch die Zehntausender, Hunderttausender, und so weiter. Diese Namen geben den Wert der Ziffer an einer Stelle an. Der gesamte Wert einer Zahl abcd ergibt sich also aus den Ziffern a, b, c und d wie folgt:
Wert = 1000 * a + 100 * b + 10 * c + 1 * d
Für eine Zahl mit n Ziffern a_i gilt:
Wert = Summe von i = 0 bis n über 10^i a_i
Angenommen, es gäbe jetzt keine 10 verschiedene Ziffern, sondern nur 2. Dann kannst du ganz analog anfangen zu zählen: 0, 1
Jetzt gibt es das selbe Problem, es gibt keine Ziffern mehr; also fängst du an, Ziffern zu kombinieren:
0, 1, 10, 11, 100, 101, 110, 111, 1000, 1001, 1010, 1011, 1100, 1101, 1110, 1111, ...
Die Stellenwerte der Ziffern sind jetzt nicht mehr Einer, Zehner, Hunderter sondern Einer, Zweier, Vierer, ... und der Wert ergibt sich nun aus
Wert = Summe von i = 0 bis n über 2^i a_i
Für "Bitflags" hast du jetzt eine Zahl, und möchtest damit speichern, welche Gruppen einer Nutzer hat; anstatt das aber direkt über den Wert der Zahl zu speichern, siehst du jede Ziffer der Zahl als einen booleschen Wert, der angibt, ob der Nutzer in einer Gruppe ist oder nicht. Angenommen, du hast die Gruppen g_1, ..., g_n. Dann gibt das erste Bit (die Einer) an, ob der Nutzer in g_1 ist oder nicht, das zweite Bit (Zweier) gibt an, ob es in g_2 ist, usw. Allgemein also: Das Bit mit dem Stellenwert 2^i gibt an, ob der Nutzer in Gruppe g_(i + 1) ist.
Jetzt brauchst du noch eine Möglichkeit, komfortabel einzelne Bits (also Ziffern einer binären Zahl) zu lesen und zu setzen. Dazu kannst du zum Beispiel folgenden Code nutzen, wobei
$status deine Variable ist:
Nutzer in Gruppe g_i zuweisen:
$status |= (1 << (i - 1))
Ist Nutzer in Gruppe g_i?
(($status >> (i - 1)) & 1)
Nutzer aus Gruppe g_i löschen:
$status &= ~(1 << (i - 1))