Het & teken
Code (php)
1
2
3
4
2
3
4
function checkpermissies($piRechtenVanUser , $piRecht)
{
return $piRechtenVanUser & $piRecht;
}
{
return $piRechtenVanUser & $piRecht;
}
Maar wat doet dat &-teken?
http://www.php.net/manual/nl/language.operators.bitwise.php
Ik heb het even doorgelezen, ik snap het nog niet echt ;D
edit:
Ik heb het, neem nu:
Hoe zien die 12 en 9 er dan uit in bitjes:
1 - 2 - 4 - 8
0 - 0 - 1 - 1 = 12
1 - 0 - 0 - 1 = 9
1 - 0 - 1 - 0 = 5
Hoe komen we nu aan 5?
De ^ operator betekent dan maar 1 van de bitjes van 12 en 9 geset moet zijn dus:
0 - 1 = 1
0 - 0 = 0
1 - 0 = 1
1 - 1 = 0
1010 is 5
Zo gaat het dus ook met &, | en ~.
Edit:
1 - 2 - 4 - 8
0 - 0 - 1 - 1 = 12
1 - 0 - 0 - 1 = 9
1 - 0 - 1 - 0 = 5
moet dus zijn:
8 - 4 - 2 - 1
1 - 1 - 0 - 0 = 12
1 - 0 - 0 - 1 = 9
0 - 1 - 0 - 1 = 5
Want 12 >> 1 is 6 dat is dus
0110
De twee 1 tjes zijn dus 1 stap naar rechts verplaatst.
Gewijzigd op 01/01/1970 01:00:00 door Martijn B
En wat ik ook wel 'ns gezien heb, is een & teken voor de $parameter.
Zou iemand dat ook kunnen uitleggen? En eventueel een aanvulling op de uitleg van Martijn.
+= of .= , -= ken ik wel maar ^= niet. Deze kan ik ook zosnel niet vinden in de PHP documentatie.
edit:
3e bericht van boven http://www.php.net/manual/nl/language.operators.assignment.php
2e vraag:
De functie heeft een parameter met een reference. Een voorbeeldje doet wonderen:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
error_reporting(E_ALL);
function test1( $parameter )
{
$parameter += 1;
}
function test2( &$parameter )
{
$parameter += 1;
}
$variabele = 10;
test1($variabele);
echo $variabele; // Geeft 10
test2($variabele);
echo $variabele; // Geeft 11
?>
error_reporting(E_ALL);
function test1( $parameter )
{
$parameter += 1;
}
function test2( &$parameter )
{
$parameter += 1;
}
$variabele = 10;
test1($variabele);
echo $variabele; // Geeft 10
test2($variabele);
echo $variabele; // Geeft 11
?>
Info: http://www.php.net/manual/nl/language.references.php
Gewijzigd op 01/01/1970 01:00:00 door Martijn B
http://nl3.php.net/references
Ik snal er alleen niks van:P
@Martijn
Je hebt het over
Maar je doet niks met de 9?
Quote:
En wat ik ook wel 'ns gezien heb, is een & teken voor de $parameter.
Dat is een zogenaamde "pass by reference" variabele, lees het artikel over references maar eens door. Je maakt hiermee geen kopie van de variabele welke je meegeeft maar verwijst naar de daadwerkelijke variabele:
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
<?php
function reference_test( &$var )
{
$var = 100;
}
$a = 1;
reference_test( $a );
echo $a;
?>
function reference_test( &$var )
{
$var = 100;
}
$a = 1;
reference_test( $a );
echo $a;
?>
Een bitwise-operator is gewoon net een operator zoals +, -, * en / dat zijn.
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.
3 & 2 = 2
3 & 1 = 1
Maar stel nu dat iemand nummer 5 heeft:
5 & 1 = 1
5 & 2 = 0 (ofwel: geen schrijfrechten)
5 & 4 = 4
We vergelijken de bitwaardes van 12 en 9 met elkaar aan de hand van de ^ operator.
Het is misschien handig om te weten hoe je de 1-en en 0-en moet lezen.
Decimaal: 1111
- 1 duizendtal
- 1 honderdtal
- 1 tiental
- 1 enkel getal
Binair: 1111
- 1 1-bit
- 1 2-bit
- 1 4-bit
- 1 8-bit
Dit is dus 1+2+4+8 is 15, 1111(binair) is dus 15(decimaal). Met de binary operators gaan we dus decimale getallen binair met elkaar vergelijken.
Quote:
Lezen: 1
Schrijven: 2
Uitvoeren: 4
Schrijven: 2
Uitvoeren: 4
Hoe gaat dat verder?
Als ik bijv. de volgende rechten heb:
Lezen: 1
Schrijven: 2
Uitvoeren: 4
Wijzigen: 8
Verwijderen: ?16?
Verplaatsen: ?32?
Locken: ?64?
Belangrijk maken: ?128?
Wat zijn die laatste paar, of kunnen/bestaan deze niet?
Gewijzigd op 01/01/1970 01:00:00 door Zero Dead
Beginner 1
Gevorderd 2
Expert 4
Guru 8
16, 32, 64 etc....tot ongeveer 2 tot de macht 32 aangezien PHP alleen bitwise operaties kan uitvoeren op 32bits getallen.
Die 1, 2, 4, 8 etc zijn dus "bits":
Gewijzigd op 01/01/1970 01:00:00 door Remco van Arkelen
Gewijzigd op 01/01/1970 01:00:00 door Martijn B
Hehe....idd ;)
gaan we het op PHPhulp nu ook al hebben over binaire sh*t? :-p
Code (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. . .
Quote:
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
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.
Quote:
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 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
Gewijzigd op 01/01/1970 01:00:00 door Zero Dead
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:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#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 ...
#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
Gewijzigd op 01/01/1970 01:00:00 door Jan Koehoorn
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:|
Gewijzigd op 01/01/1970 01:00:00 door Zero Dead