Blog

Bitsgewijze operatoren

Tientallige (decimaal) getalsysteem
3579 = (3 * 10^3) + (5 * 10^2) + (7 * 10^1) + (9 * 10^0) = 3000 + 500 + 70 + 9
1000 100 10 1
3 5 7 9

Tweetallige (binaire) getalsysteem
24 = (0 * 2^7) + (0 * 2^6) + (0 * 2^5) + (1 * 2^4) + (1 * 2^3) + (0 * 2^2) + (0 * 2^1) + (0 * 2^0) = 16 + 8
128 64 32 16 8 4 2 1
0 0 0 1 1 0 0 0

Bytes en Bits

Er gaan 8 bits in 1 byte.

De hoogste waarde van een byte is 255.


Bitsgewijze operatoren
$a & $b AND Bits die voorkomen in $a en $b
$a = 12;
$b = 24;
echo $a & $b;

Het resultaat is 8 :

  128 64 32 16 8 4 2 1
12 0 0 0 0 1 1 0 0
24 0 0 0 1 1 0 0 0
$a = 13;
$b = 25;
echo $a & $b;

Het resultaat is 9 :

  128 64 32 16 8 4 2 1
13 0 0 0 0 1 1 0 1
25 0 0 0 1 1 0 0 1

$a ^ $b XOR (exclusive or) Bits die voorkomen in $a of $b, maar niet in bijde voorkomen
$a = 12;
$b = 24;
echo $a ^ $b;

Het resultaat is 20 :

  128 64 32 16 8 4 2 1
12 0 0 0 0 1 1 0 0
24 0 0 0 1 1 0 0 0

~ $a NOT Bits die niet voorkomen in $a
$a = 12;
$b = 24;
echo ~$a & $b;

Het resultaat is 16 :

  128 64 32 16 8 4 2 1
12 0 0 0 0 1 1 0 0
24 0 0 0 1 1 0 0 0

Bits die niet voorkomen in $b

$a = 12;
$b = 24;
echo $a & ~$b;

Het resultaat is 4 :

  128 64 32 16 8 4 2 1
12 0 0 0 0 1 1 0 0
24 0 0 0 1 1 0 0 0

$a << $b Shift left Verschuift de bits van $a $b naar links
$a = 24;
echo $a << 2; // met twee vermenigvuldigen

Het resultaat is 96 :

  128 64 32 16 8 4 2 1
24 0 0 0 1 1 0 0 0
96 0 1 1 0 0 0 0 0
16 x 2 = 32 x 2 = 64
8 x 2 = 16 x 2 = 32
64 + 32 = 96

$a >> $b Shift right Verschuift de bits van $a $b naar rechts
$a = 24;
echo $a >> 2; // delen door twee

Het resultaat is 6 :

  128 64 32 16 8 4 2 1
24 0 0 0 1 1 0 0 0
6 0 0 0 0 0 1 1 0
16 : 2 = 8 : 2 = 4
8 : 2 = 4 : 2 = 2
4 + 2 = 6

Voorbeeld
define('READ', 1);
define('ADD', 2);
define('EDIT', 4);
define('DELETE', 8);

$gebruiker = 7;

echo ($gebruiker & READ) ? "

Gebruiker mag lezen

" : "

Gebruiker mag niet lezen

"; echo ($gebruiker & ADD) ? "

Gebruiker mag toevoegen

" : "

Gebruiker mag niet toevoegen

"; echo ($gebruiker & EDIT) ? "

Gebruiker mag wijzigen

" : "

Gebruiker mag niet wijzigen

"; echo ($gebruiker & DELETE) ? "

Gebruiker mag verwijderen

" : "

Gebruiker mag niet verwijderen

";

Het resultaat is :

Gebruiker mag lezen

Gebruiker mag toevoegen

Gebruiker mag wijzigen

Gebruiker mag niet verwijderen

Voordelen

Het voordeel is dat je op deze manier in plaats van verschillende velden :

permission_read permission_add permission_edit permission_delete
true true true false

Maar één veld in de database nodig is voor het opslaan van rechten :

permissions
7

Nadelen

Rekenen met bits is geen dagelijks bezigheid, als je later nog eens wijzigingen wilt maken kan je de hele materie weer gaan herhalen.


Meer informatie : PHP: Bitwise Operators - Manual

Zoeken