phpbar.de logo

Mailinglisten-Archive

Bits und Bytes (war Re: [php] Berechtigungs System)

Bits und Bytes (war Re: [php] Berechtigungs System)

Johannes Schlueter schlueter at phpbar.de
Son Feb 1 17:25:21 CET 2004


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