Swappen van variabelen

Door Roel -, 15 jaar geleden, 7.826x bekeken

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

PHP script bestanden

  1. swappen.php

 

Er zijn 4 reacties op 'Swappen van variabelen'

PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Niels K
Niels K
15 jaar geleden
 
0 +1 -0 -1
Lees deze uitleg eens: klik.
Jacco Brandt
Jacco Brandt
15 jaar geleden
 
0 +1 -0 -1
list($x, $y) = array($y, $x)??
- SanThe -
- SanThe -
15 jaar 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)
PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Pim -
Pim -
15 jaar 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.

Inhoudsopgave

  1. swappen.php

Labels

Navigatie

 
 

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.