Ik zag in een PHP tut de volgende functie staan:

function checkpermissies($piRechtenVanUser , $piRecht)
{
  return $piRechtenVanUser & $piRecht;
}


Maar wat doet dat &-teken?
gaan we het op PHPhulp nu ook al hebben over binaire sh*t? :-p
Dingen als:

<?php
function checkpermissies($piRechtenVanUser , $piRecht)
{
  return $piRechtenVanUser & $piRecht;
}
?>

<?
echo 12 ^ 9; // Outputs '5'
?>

http://www.php.net/manual/nl/language.operators.bitwise.php


vind ik toch wel met PHP te maken hebben:)
Ik snap er nog niet echt veel van, maar ik ga me er eens in verdiepen. . .
Binair => Decimaal
00001 = 1
00010 = 2
00100 = 4
01000 = 8
10000 = 16
(etc; per stap hoger: 'Binair' * 10 en 'Decimaal' * 2)

10101 = 21
Decimaal: 1 + 4 + 16 = 21
Binair: 00001 + 00100 + 10000 = 10101


Dat verhaal is niet moeilijk als je een beetje een logica probeert te vinden.

In de functie die TS hier geeft wordt gecontroleerd of een bepaalde "bit" in het getal is "geset", dit soort structuren worden heel vaak gebruikt met rechtensystemen.

Stel dat er de volgende rechten zijn:

Lezen: 1
Schrijven: 2
Uitvoeren: 4

Iemand met het nummer 3 heeft dus recht op lezen en schrijven, bit 1 en 2 zijn hoog. (bits 1 en 2 zijn TRUE; 1)

3 & 1 = 1
3 & 2 = 2
3 & 4 = 0 (niet uitvoeren)

Maar stel nu dat iemand nummer 5 heeft:

5 & 1 = 1
5 & 2 = 0 (ofwel: geen schrijfrechten)
5 & 4 = 4


Stel jij hebt een volgende rechten systeem:

Lezen: 1
Schrijven: 2
Uitvoeren: 4
Wijzigen: 8
Verwijderen: 16
Verplaatsen: 32
Locken: 64
Belangrijk maken: 128

En je wilt een gebruiker de rechten 'Lezen', 'Schrijven', 'Wijzigen', en 'Locken' geven, tel je de waarden bij elkaar op:

Lezen: 1
Schrijven: 2
Wijzigen: 8
Locken: 64
Totaal: 75

Dus je geeft een gebruiker het rechten 'nummer' 75. Simpel.

Om dan weer uit te vinden of een waarde is gekozen gebruik je PHP's bitwise codes.

Stel je gebruikt een forum met topics; Als je wilt weten of een gebruiker een 'topic' kan 'locken', gebruik je de volgende code:

75 & 64 = 64, dus de gebruiker kan 'topics locken'
Als je wilt weten of een gebruiker kan uitvoeren gebruik je weer:
75 & 4 = 0, dus de gebruiker kan NIET uitvoeren.

Zoiets snap ik ervan+.+

-edit-

PHP's bitewise manual;

http://www.php.net/manual/nl/language.operators.bitwise.php
Een bitwise operator werd vroeger vaak gebruikt voor ja-nee situaties. Als je een aantal parameters had die alleen ja of nee konden zijn kon je in een byte 8 van die parameters opslaan. Met het & teken en een voorgedefinieerde constante kon je dan checken of een bepaald bit gezet was.

0000 0001 = 1 (2 tot de macht 0)
0000 0010 = 2 (2 tot de macht 1)
0000 0100 = 4 (2 tot de macht 2)

Voorbeeld in C:

#define FLAG_1 1
#define FLAG_2 2
#define FLAG_3 4
#define FLAG_4 8
#define FLAG_5 16
#define FLAG_6 32
#define FLAG_7 64
#define FLAG_8 128

    int mijnvar = 222; 
    if (mijnvar & FLAG_1) {
        // vlag 1 is gezet
    }
    if (mijnvar & FLAG_2) {
        // vlag 2 is gezet
    }
    enz ...


edit: de & operator levert dus TRUE op als beide bits gezet zijn
Vooral handig voor rechten systemen:)

Maar toe hoe hoog kan je nou gaan?
2 tot de 32e macht? (+/- 4.3miljard)

En teld dit alleen voor 32 bits systemen of ook voor 64 bits(bijv. opteron) systemen?

-edit-
Off topic:

Verschil tussen 32 bits en 64 bits processoren:
32 bits: 4 294 967 296
64 bits: 18 446 744 073 709 551 616

Dus 64 bits is theoretisch 4 294 967 296x beter dan 32 bits:|

Reageren