Bitwise PHP

Door Wouter J, 8 jaar geleden, 4.797x bekeken

Dit is, vind ik, een van de moeilijkste dingen in PHP. Jaren heb ik gedacht dit sla ik over, totdat ik het een tijdje geleden maar eens begon te leren.
Veel mensen slaan dit onderwerp ook over, precies zoals ik. Want waar heb je het eigenlijk voor nodig? En omdat je het bijna nooit gebruikt en het is moeilijk, waarom zou je het dan gaan leren? Ik geef je gelijk, maar toch is het handig om te weten en in grote projecten te gebruiken.

Nu verwacht iedereen natuurlijk dat ik begin met een voorbeeld te geven waarin het gebruikt wordt. Nu moet ik dat eerst globaal doen, want anders begrijp je er niks van. Een heel goed voorbeeld is het error_reporting systeem van PHP. Je hebt het niet door, omdat je met constanten werkt. Maar eigenlijk werk je daar voordurend met bitwise PHP. Aan het eind van deze tutorial begrijp je hoe het werkt en laat ik je een voorbeeld zien van hoe je het kunt gebruiken in een CMS.

Het doel van deze tutorial is dat je in een ander telsysteem leert tellen en met de PHP bitwise operators weet te werken. Per hoofdstuk staan er wat vragen, zodat je er mee oefent. Want ik ben van mening dat dat de manier is om iets te leren, maak deze vragen en in het laatste hoofdstuk staan mijn uitwerkingen.

Veel succes en plezier!

Gesponsorde koppelingen

Inhoudsopgave

  1. De mens
  2. De computer
  3. De computer (2)
  4. Decimal naar Binary
  5. Operators
  6. Operators combineren
  7. Voorbeelden
  8. Eindwoord en antwoorden
  9. Extra's: HEX

 

Er zijn 12 reacties op 'Bitwise php'

PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Niels K
Niels K
8 jaar geleden
 
1 +1 -0 -1
Mooie tutorial Wouter. Complimenten!
Wouter J
Wouter J
8 jaar geleden
 
0 +1 -0 -1
Iets wat ik jullie na het lezen van deze tutorial niet wil onthouden is dit script van Karl en de uitleg die daarop volgt:
Script en de oplossing (wel even het bericht selecteren, dan zie je de uitleg)
Pim -
Pim -
8 jaar geleden
 
0 +1 -0 -1
Mooi!
Je begint bij 0 en zet dan alles netjes op een rijtje.
Goed werk!

Nu nog octals ;-)
- SanThe -
- SanThe -
8 jaar geleden
 
1 +1 -0 -1
Hallo Wouter,

Een leuke en duidelijk tutorial lijkt mij. Ik denk voor iedereen goed te volgen.

Ik heb echter een aantal kleine foutjes ontdekt en die wil ik je even melden.

De mens: Moet 5 zijn.
1 * 1000 + 9 * 100 + 9 * 10 + 3 * 1 = 1953

De computer (2): Moet 31 zijn.
0 + 0 + 0 + 16 + 8 + 4 + 2 + 1 = 3

Operators: Je mist de ^ (XOR).
... bitwise operators deze zijn: &, |, ~, >> en <<.
(De uitleg staat er wel onder).

Operators: Moet 246 zijn.
... 1111 0110 en dat is weer 245.

Operators combineren: Ik zou dit '~$b = 1111 0101, want deze is negatief' niet negatief noemen, maar eerder gespiegeld. Negatief is kleiner dan nul.

Voorbeelden: Moet if zijn.
ff( $piet & $globalWriter )

Voorbeelden: Alles onder nul is ook true.
0010 0000 = 32 = true (alles boven 0 is true)

Extra's Hex: Moet 16 zijn.
Want die 10 betekend niet onze 10, maar 17.

SanThe


8 jaar geleden
 
1 +1 -0 -1
Ik denk dat je 99 eenheden bedoeld.
Dat
betekend dat we stoppen bij 99
10tallen en dan springen we over
op 1 hondertal (wat eigenlijk 10
tientallen zijn).
Wouter J
Wouter J
8 jaar geleden
 
0 +1 -0 -1
@niels, pim, santhe en boris, bedankt voor de complimenten!

@santhe en boris, bedankt voor je oplettendheid.

Ik heb ze verbeterd, al ben ik aan het twijfelen over negatief. Negatief heeft meerdere betekenissen, onder 0. Maar ook als iets het tegenovergestelde is van iets. Als je de kleur zwart hebt en je zegt in photoshop negatief dan wordt het wit. Ik bedoelde die negatief.
Edit:
Dankzij Erwin H heb ik het juiste woord gevonden: Inverse


En boris, ik bedoelde 9 10tallen. Ik heb ook dit verbeterd.

Ik wist dat na zoveel rekenen ik wel wat dingen over het hoofd zou hebben gezien... :)
- SanThe -
- SanThe -
8 jaar geleden
 
0 +1 -0 -1
Hallo Wouter,

Bij Operators had je 2 keer 245 staan. Je hebt er echter maar 1 veranderd in 246.

Geeft 245. Want $a = 0000 1001 en het negatieve is: 1111 0110 en dat is weer 246.
Iris B
Iris B
8 jaar geleden
 
0 +1 -0 -1
Dag allemaal,

Ook ik ben aan het leren en heb de tutorial gelezen. Erg duidelijk en heb er veel aan gehad, dus bedankt!

Ik heb een vraag over de binary not operator, want ik krijg niet het resultaat dat ik verwacht.

$a = 5; // 0000 0101
echo ~$a; // 1111 1010 toch?

Dit geeft -6 ... terwijl ik 250 verwacht nav de uitleg in de tutorial ?

Wat begrijp ik verkeerd?
Iris B
Iris B
8 jaar geleden
 
1 +1 -0 -1
Ok ik heb wat gegoogled en de reden dat de uitleg in de tutorial niet klopt is omdat PHP niet met unsigned integers werkt.
In PHP gaat het om signed integers en daarom werkt de ~ NOT operator anders.

Moet het zelf ook nog bestuderen maar hier is in ieder geval meer info:

http://en.wikipedia.org/wiki/Bitwise_operation#NOT
http://en.wikipedia.org/wiki/Two%27s_complement
http://en.wikipedia.org/wiki/Signed_number_representations

:) Iris
Jurgen B
Jurgen B
8 jaar geleden
 
0 +1 -0 -1
Bij een signed integer geeft het eerste bit de signedness aan. Dat wil zeggen een 1 als het getal negatief is en een 0 als deze positief is. De waarde van een signed integer (uitgaande van 1 byte/8bit) ligt tussen -128 en 127, terwijl dat voor een unsigned integer tussen 0 en 255 is.
Iris B
Iris B
8 jaar geleden
 
1 +1 -0 -1
Een 'simpele' manier om het uit te leggen is:

Wanneer het om 'signed integers' gaat, bepaalt de 'most significant bit' (bitpositie met hoogste waarde) of het een positieve of negatieve waarde betreft (zoals Jurgen B ook zegt):

een 0 = positief
een 1 = negatief

0000 0010 = +2
1111 1101 = -3

Het gaat hier om het 'two's compliment' systeem, waarbij er 1 nulwaarde bestaat, namelijk: 0000 0000

De negatieve bitwaardes zijn plus 1 groter dan de positieve bitwaarde.
(check de uitleg over het 'one's compliment' systeem waarom: http://en.wikipedia.org/wiki/Signed_number_representations)

Positief (bit met hoogste waarde, meest links, is 0):

0000 0011 = +3 (alleen de 1en hebben een waarde en die tel je op)

Negatief (bit met hoogste waarde, meest links, is 1):

1111 1100 = -4 (het omgekeerde: alleen de 0en hebben een waarde en tel je op + 1)


Dit verklaart waarom bij het gebruik van de 'bynary NOT' operator in de tutorial :

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php

$a
= 9; // 9 = 8 + 1 = 0000 1001

echo ~$a;

?>


geen 246 maar 1111 0110 = -(9+1) = -10 op het scherm geeft.
PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Wouter J
Wouter J
8 jaar geleden
 
0 +1 -0 -1
Bedankt voor het zoekwerk en de uitleg Iris!! :D

Ik zal het vandaag eens gaan doorlezen en uitzoeken en een hoofdstukje toevoegen.

Om te reageren heb je een account nodig en je moet ingelogd zijn.

 
 

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.