Jump to content
php.lv forumi
darksign

Kurš māk stilīgāk apmainīt divu mainīgo vērtības?

Recommended Posts

Ghenis .. un ko tieši tev iedeva? :))

 

p.s. vēl viens labs fitrs meklējot tieši koderi ir pajautāt viņam kādā veidā (uz papīra/tāfeles) viņš apmainīs divus mainīgos... šeit tikai jāizdomā ko grib redzēt, vai lai viņš uzstāda trešo mainīgo, vai arī neizmantojot trešo mainīgo... :)

 

un vispār.. ko domājat.. kas ir labāks

 

$a = 3;
$b = 2;

$a = $a * $b; //{6}
$b = $a / $b; //{3}
$a = $a / $b; //{2}

 

vai

 

$a = 3;
$b = 2;

$c = $b; //{2}
$b = $a; //{3}
$a = $b; //{2}

 

Ikdienā ticu ka gandrīz visi izmantos otro variantu..

 

taču varbūt ir kāds matemātiski pamatots iemesls kāpēc izvēlēties vienu vai otru? piemēram.. cik atmiņu noēd pirmais un cik otrais.. kurš izpildās ātrāk (nevis vnk pēc operāciju skaita, bet pēc ātruma utt...)...

 

interesanti.. :D

Share this post


Link to post
Share on other sites
un vispār.. ko domājat.. kas ir labāks

Vienoziimigi otrais variants, pamatojums ir vienkarsh un logjisks ...

1. Saprotamaks kods

2. Vienoziimigi atraks un ekanomiskaaks... // 2trajaa variantaa tikai 1 pieskirsanas operacija , 1ja pieskirsana + Reizinasana , kas Reali ir saskaitiisanu virkne

3. mazaka iespejamaa kljuuda ,

4. 1ais variants stradaas TIKAI uz skaitliskiem mainiigajiem ;) // nu ja nezdomas hitraa veidaa mainiit pa baitiem ;)

 

P.S. taatad Reali paliek Tikai 2 varints ...

Share this post


Link to post
Share on other sites

Es teiktu, ka pirmo variantu izvēlētos tikai dikti slimi programmētāji. Tas pie tam ir līks un neprecīzs. Pamēģini vien apmainīt divus floatus, kuru vērtības ir 1e150 un 1e200. Vai tikpat labi divus integer'us, kuri ir 0 un 100.

Tas, kas izvēlētos otro variantu, izdarītu tikai pareizu un ļoti labu variantu - gan no performances, gan koda kārtības viedokļa.

 

Es gan šādā situācijā izmantotu:

list($a, $b) = array($b, $a);

Tas no man pitona iegājies, kur var rakstīt:

a, b = b, a

tur komats veido tupli (masīva paveids).

Share this post


Link to post
Share on other sites

Php gadījumā noteikti izvēlētos otro - puķu podu variantu (atslēgas vārds Pēcis Beisikānis).

 

Taču pie zināmiem apstākļiem (piemēram vismaz kādreiz assemblerā) ātrāks ir pirmais variants - tikai nevis reizināšana, dalīšana, bet gan dalīšana pēc moduļa 2, jeb XOR

 

Ja a un b vērtības glabājas reģistros AX un BX, tad tās samaina vietām:

XOR AX,BX

XOR BX,AX

XOR AX,BX

pamatojums: XOR darbojās (vismaz kādreiz) ātrāk par MOV, nemaz nerunājot par lasīšanu/rakstīšanu RAMā.

Share this post


Link to post
Share on other sites

Aleksej, kādus tu jokus te raksti? x86 assemblerā ir visai smuka XCHG instrukcija:

XCHG AX, BX

Share this post


Link to post
Share on other sites
Taču pie zināmiem apstākļiem (piemēram vismaz kādreiz assemblerā

Tas ir tas ko teicu Ja vien Neizdomas visu mainiit pa Baitiem ...

Un ko dariisi ja maniiga vertiba satur masiivus ??? Arii izmantosi dalisano peec modulja ??

+ kaa ja bubu mineja un kapeec gan ne XCHG ??

Share this post


Link to post
Share on other sites

kapēc ne XCHG.. tapēc ka vnk nezin jaunieviestās instrukcijas.. ikdienā nelieto assembleru un līdz ar to neseko līdz visam tam.. droši vien tapēc :D

 

nemaz nezināju ka tāds XCHG ir.. tnx par infu :)

 

 

 

bubu variants ar masīviem .. forši :) nebiju redzējis ka kāds pielietotu dzīvē šo variantu :) (laikam bubu mums viens no tiem kūl dzekiem kas think out of box :)) ) vai arī tas nācis tikai pēc pyton :)

Share this post


Link to post
Share on other sites

Vot vot, kad sen atpakaļ ņēmos ar asm, tad part tādu XCHG nezināju vai tāds nemaz nebija (jāpapēta sīkāk). Ar XOR`iem varēj itin žiperīgi apmainīties vērtībām :)

 

Update: biki google, un "Available only on 80386 and later processors". Ar asm kruķījos uz 80286 :D

 

Update2: savukārt wikipedia saka, ka "The Intel 8086, released in 1978, also included an instruction named XCHG." Ej nu taga sazini...

Edited by marrtins

Share this post


Link to post
Share on other sites

Vēlreiz akcentēju pie zināmiem apstākļiem (~;

 

Vienkārši likās interesanti padalīties, ka ir arī šāds variants. Bez tam fakts, ka XCG ir viena asm komanda vēl neko neizsaka par to, cik taktīs tas viss izpildīsies - viss atkarīgs no procesora. (~;

Share this post


Link to post
Share on other sites

nja.. jo zemaakas komandas izmanto... jo lielaaka kontrole paar to ko tu dari :))

 

bet kas zin.. varbuut intel/amd ... whatever ... ir izveidojushi taas lietas tik taal ieksh hardwares ka tomeer ir viena vieniiga darbiiba ar to XCHG

Share this post


Link to post
Share on other sites

3. variants bez tresha mainiga, stradas labi, kamer nebus izgajis pari mainiga robezai (lielumam)

 

$a = 3;
$b = 2;

$a = $a+$b; //5
$b = $a-$b; //3
$a = $a-$b; //5-3

Edited by cucumber

Share this post


Link to post
Share on other sites

Grey_Wolf ---> ar citam metodem (:

 

nebija isti teikts par ko iet runa, mans variants ir skaitliem, es domaju some kind of stiligi ta darit

Edited by cucumber

Share this post


Link to post
Share on other sites
Update2: savukārt wikipedia saka, ka "The Intel 8086, released in 1978, also included an instruction named XCHG." Ej nu taga sazini...

Tieši tā - XCHG ir jau kopš 8086 procesora. Nekas jauns tas nav.

 

XOR triku, ja tiešam jāmaina tikai veseli skaitļi, var arī pielietot augsta līmeņa valodās, bet nu es tam personīgi neredzu jēgu:

$a ^= $b ^= $a ^= $b;

Share this post


Link to post
Share on other sites

×
×
  • Create New...