Mailinglisten-Archive |
Hallo, Quoting Michael Schoenboeck <liste-php at digitalhome.cc>: > Hmmm, auch das ist mir nicht ganz klar. Liegt wohl daran das mir das wirt > bitmuster jetzt nichts sagt, bzw. ich mir darunter nichts vorstellen kann. Ok, Computer können nicht viel. Die können gerade mal zwei Zustände vergleichen true/false, an/aus, high/low, 1/0 oder wie auch immer man diese nennen will. Deswegen arbeit er nicht, wie wir, im dezimal-System, sondern im Binärsystem mit dem binärem Pendant zu einer Zahl im Dezimalsystem. Ein Integer nutzt also X Bit (Bit = Binary Digit, Binäre Ziffer, also 0 oder 1) Speicher, wenn man mit PHP Arbeit ist ein Integer in den meisten Fällen 32 Bit groß und Vorzeichenbehaftet um mir etwas Schriebarbeit zu sparen mache ich alle flgenden Beispiele mit 8 Bit (=1 Byte) Mal ein paar Rechenübungen: 1 (dez) = 00000001 (bin) 2 (dez) = 00000010 (bin) 3 (dez) = 00000011 (bin) 4 (dez) = 00000100 (bin) 8 (dez) = 00001000 (bin) 254 (dez) = 11111110 (bin) 255 (dez) = 11111111 (bin) Da sieht man, dass die 2er Potenzen (2^0, 2^1, 2^2, ..., 2^x) immer auf Position x von rechts sind (entsprechend meiner Schreibrichtung, die ich prinzipiell aber auch umdrehen könnte). Was bringt uns das jetzt? Zunächst nicht viel, jetzt brauchen wir die Bit-Operatoren. Diese Operatoren, sind relativ ähnlich zu den logischen Operatoren (&&, ||, ...) sehen daher uach so ähnlich aus, beziehen sich aber nur auf einzelne Bits obiger Muster und sind daher kleiner (&, |, .. - ok die Begründung entspringt gerade meiner Phantasie aber dürfte in etwa hinkommen) Was sie machen ist recht einfach: Bit für Bit über die Bits gehen und entsprechend einfacher Regeln das entsprechende Ergebnis Bit setzen. Eine einfache Verknüppfung ist die Und-Vernüpfung (&) - die setzt ein Bit dann wenn ein Bit ein beiden Operaten gesetzt ist auch das entsprechende Ergebnis-Bit: 0 1 10 11 11001010 &0 &1 &11 &11 &01010110 -- -- --- --- --------- 0 1 10 11 01000010 Wie kann man das jetzt nutzen? Wir können jedes Bit jetzt mit einem Recht belegen, z.B. Position 0 (von rechts wieder) entspricht "Darf News lesen", Position 1 "Darf News schreiben", Position 2 "Darf News freischalten", ... Wie oben schonmal geschrieben entspricht die Position der 2er Potenz, in PHP können wir nun also schreiben: <?php $lesen = 1; // 2^0 = 1(dec) = 00000001(bin) $schreiben = 2; // 2^1 = 2(dec) = 00000010(bin) $freischalten = 4; // 2^2 = 4(dec) = 00000100(bin) ?> Da jeweils ein verschiedenes Bit gesetzt ist können wir die Rechte eines Users jetzt in eine Zahl zusammenfassen: <?php $darf_nix = 0; // 0(dec) = 00000000(bin) $darf_lesen = 1; // 1(dec) = 00000001(bin) $darf_alles = 7; // 1+2+4(dec) = 7(dev) = 00000111(bin) ?> So können wir jetzt 8 (bzw. 32 oder wie lange unser Int auch immer ist) Rechte in einem Int speichern. Das speichern alleine bringt natürlich nocht nichts, wir müssen es auch auslesen: Da hilft uns das bitweise Und, damit können wir ja,wieoben gesehen einzelne Bits abfragen. <?php if ($darf_alles & $freischalten == $freischalten) { // 00000111 & 00000100 == 00000100 (ergibt true, also darf der USer news freischalten) } if ($darf_lesen & $freischalten == $freischalten) { // 00000001 & 00000100 == 00000000 (ergibt false, also darf der USer keine news freischalten) } ?> Entsprechendes kann man dann auch noch mit anderen Bit-Operatoren machen - alos z.B. dem Not - wenn der User ein Flag nicht gesetzt hat wird es im Ergebnis gesetzt usw. Insbesondere C-Programmierer sind Freunde von Bit-Operationen, kaum ein Program ohne, aber auch PHP ist nicht ohne: Die error_reporting-Konstanten E_* funktionieren aufdiese Weise. Nunja, eigentlich wollte ich jetzt keinen Roman schreiben sondern nur eine knappe Einführung und dann auf Google und die Literatur zu einer (fast) beliebigen Programmiersprache hinweisen. ;-) johannes
php::bar PHP Wiki - Listenarchive