Het & teken

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Zero Dead

Zero Dead

25/06/2006 15:51:00
Quote Anchor link
Ik zag in een PHP tut de volgende functie staan:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
function checkpermissies($piRechtenVanUser , $piRecht)
{
  return $piRechtenVanUser & $piRecht;
}


Maar wat doet dat &-teken?
 
PHP hulp

PHP hulp

22/12/2024 08:02:34
 
Martijn B

Martijn B

25/06/2006 15:55:00
Quote Anchor link
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:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?
echo 12 ^ 9; // Outputs '5'
?>


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
 
Eric Cartman

Eric Cartman

25/06/2006 16:26:00
Quote Anchor link
Ik snap het niet echt, maar het ziet er interressant uit. Maar wat doet zo'n bitwise operator dan voor een =-teken?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$variabale ^= 1;


En wat ik ook wel 'ns gezien heb, is een & teken voor de $parameter.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
function (& $parameter) {

  return 'Hoi?';
}


Zou iemand dat ook kunnen uitleggen? En eventueel een aanvulling op de uitleg van Martijn.
 
Martijn B

Martijn B

25/06/2006 16:38:00
Quote Anchor link
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:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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

?>


Info: http://www.php.net/manual/nl/language.references.php
Gewijzigd op 01/01/1970 01:00:00 door Martijn B
 
Zero Dead

Zero Dead

25/06/2006 16:43:00
Quote Anchor link
@Jip:

http://nl3.php.net/references

Ik snal er alleen niks van:P

@Martijn

Je hebt het over

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?
echo 12 ^ 9; // Outputs '5'
?>


Maar je doet niks met de 9?
 
Remco van Arkelen

Remco van Arkelen

25/06/2006 16:44:00
Quote Anchor link
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)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?php
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
 
Martijn B

Martijn B

25/06/2006 16:56:00
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?
echo 12 ^ 9; // Outputs '5'
?>


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.
 
Zero Dead

Zero Dead

25/06/2006 17:00:00
Quote Anchor link
Over die rechten;

Quote:
Lezen: 1
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
 
Remco van Arkelen

Remco van Arkelen

25/06/2006 17:12:00
Quote Anchor link
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":

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
Binair =>  Decimaal
00001 = 1
00010 = 2
00100 = 4
01000 = 8
10000 = 16

10101 = 21
Gewijzigd op 01/01/1970 01:00:00 door Remco van Arkelen
 
Martijn B

Martijn B

25/06/2006 17:21:00
Quote Anchor link
10101 = 21
Gewijzigd op 01/01/1970 01:00:00 door Martijn B
 
Remco van Arkelen

Remco van Arkelen

25/06/2006 17:47:00
Quote Anchor link
Hehe....idd ;)
 
K i p

K i p

25/06/2006 18:47:00
Quote Anchor link
gaan we het op PHPhulp nu ook al hebben over binaire sh*t? :-p
 
Zero Dead

Zero Dead

25/06/2006 18:59:00
Quote Anchor link
Dingen als:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
<?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:)
 
Eric Cartman

Eric Cartman

25/06/2006 19:32:00
Quote Anchor link
Ik snap er nog niet echt veel van, maar ik ga me er eens in verdiepen. . .
 
Zero Dead

Zero Dead

25/06/2006 19:50:00
Quote Anchor link
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


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 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
 
Jan Koehoorn

Jan Koehoorn

25/06/2006 20:01:00
Quote Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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 ...


edit: de & operator levert dus TRUE op als beide bits gezet zijn
Gewijzigd op 01/01/1970 01:00:00 door Jan Koehoorn
 
Zero Dead

Zero Dead

25/06/2006 20:40:00
Quote Anchor link
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:|
Gewijzigd op 01/01/1970 01:00:00 door Zero Dead
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.