Versio

Swappen van variabelen

Ik had het ooit al eens gezien, maar ik vroeg me toch af hoe het nou precies zat. Veel mensen maken voor het omwisselen van twee variabelen, een nieuwe, tijdelijke variabele aan.

Geheugenefficiëntie is belangrijk, dus het verspillen van geheugen aan een nutteloze variabele is uit den boze.

Hoe moet het dan wel?
Met dit gekke stukje code kun je twee variabelen wisselen van waarde, zonder daarbij een extra variabele aan te hoeven maken:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$x
^= $y ^= $x ^= $y;
?>


Waarbij $x je eerste variabele is, en $y je tweede.
Hoe deze snippet precies in elkaar zit weet ik ook niet, maar het doet wat het moet doen.

Op de pagina met het script staat er nog een voorbeeld van hoe het in de praktijk werkt.

Enjoy!

Gesponsorde koppelingen

BHosted Hosting al vanaf € 1,- per maand

Controleer nu gratis jouw domeinnaam:

  

PHP script bestanden

  1. swappen.php

 

4 reacties op 'Swappen van variabelen'

PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Niels Kieviet
Niels Kieviet
6 maanden geleden
 
0 +1 -0 -1
Lees deze uitleg eens: klik.
Jacco Brandt
Jacco Brandt
6 maanden geleden
 
0 +1 -0 -1
list($x, $y) = array($y, $x)??
- SanThe -
- SanThe -
6 maanden geleden
 
0 +1 -0 -1
$x is 00000111 (7)
$y is 00001100 (12)

Gebruikt wordt de formule $x ^= $y ^= $x ^= $y
Dat is binair 00000111 ^= 00001100 ^= 00000111 ^= 00001100

De notatie ^ in de formule staat voor een XOR (exclusive or) op bitniveau. Bij een vergelijking op bitniveau worden dus de bits van de ene var vergeleken met de bits van de andere var. Bij een gewone OR wordt het bit geset als er minstens één van de twee geset is. Bij een XOR wordt het bit alléén geset als er exact één van de twee geset is. En de = kennen we allemaal. Dat is het teken dat er voor zorgt dat het resultaat in de voorstaande var wordt gedaan.

Wat doet het laatste deel $x ^= $y ^= $x ^= $y
$x ^= $y geeft als resultaat 00001011 en dat wordt in $x gestopt.
Dus nu hebben we nog 00001011 ^= 00001100 ^= 00001011

Nu doen we dit deel $x ^= $y ^= $x ^= $y
$y ^= $x geeft als resultaat 00000111 en dat wordt in $y gestopt.
Nu hebben we nog 00001011 ^= 00000111

En als laatste $x ^= $y ^= $x ^= $y
$x ^= $y geeft als resultaat 00001100 en dat wordt in $x gestopt.

$x is nu 00001100 (12)
$y is nu 00000111 (7)
Pim -
Pim -
6 maanden geleden
 
0 +1 -0 -1
"Geheugenefficiëntie is belangrijk, dus het verspillen van geheugen aan een nutteloze variabele is uit den boze."
Volgens mij heb je het niet helemaal begrepen.
Rare hacks als dit zijn uit den boze.

In PHP neemt een gekopieerde variabele maar een minieme hoeveelheid geheugen in en als je net programmeert, wat wél belangrijk is, en je variabelen in een zo laag mogelijke scope houdt, zal geheugen niet zo'n probleem zijn.
Kan je me verder wijzen op een situatie die je hebt meegemaakt waarbij je normaliter je servercapaciteit had moeten uitbreiden, maar je dat met micro-optimalisaties als deze hebt voorkomen?
Sorry hoor, maar 'wijsheden' als deze dragen weinig bij aan deze toch al zo 'wijze' site.

Verder is het natuurlijk wel een leuke wiskundige vingeroefening, maar ik geloof niet dat dat je bedoeling was.

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