Het & teken
Ik zag in een PHP tut de volgende functie staan:
Maar wat doet dat &-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?
Nou dat is dus een "bitwise operator":
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.
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
Ik snap het niet echt, maar het ziet er interressant uit. Maar wat doet zo'n bitwise operator dan voor een =-teken?
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.
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.
1e vraag:
+= 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:
Info: http://www.php.net/manual/nl/language.references.php
+= 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
@Jip:
http://nl3.php.net/references
Ik snal er alleen niks van:P
@Martijn
Je hebt het over
Maar je doet niks met de 9?
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.
Over die rechten;
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?
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
Het was maar een voorbeeld he, hoe jij ze noemt moet je zelf weten, het zouden ook levels kunnen zijn :) Maar zoals jij zegt kun je het doen ja.
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":
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
10101 = 21
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
Dingen als:
vind ik toch wel met PHP te maken hebben:)
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
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:
edit: de & operator levert dus TRUE op als beide bits gezet zijn
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
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:|
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




