Swapping variables

Swappa variabler är ju något som kan vara användbart i flera sammanhang. Det klassiska exemplet brukar ges med att man har ett värde i A och ett värde i B (som kan vara likadant men inte nödvändigtvis) och sedan gör man följande operationer:

C = A
B = A
A = C

Detta sätt kräver dock extra datalagring i form av variabeln C och kan eventuellt undvikas med diverse trick. Det man bör tänka på är dock att vissa av tricken inte är helt rumsrena och har problem i vissa fall, antingen när någon av A eller B är noll eller om A = B.

Variant med addition/subtraktion:

A = A + B
B = A – B
A = A – B

Man kan vara uppmärksam på vad som händer när talen A eller B närmar sig MAX_INT det största talet som kan hanteras. När A eller B är > MAX_INT/2 kommer man få en överflödniong vid additionen och ett lån vid subtraktionen. På de flesta system fungerar detta men inte nödvändigtvis alla, det finns säkert system som är trasiga i den aspekten.

Farlig variant med XOR:

A = A ⊕ B
B = B ⊕ A
A = A ⊕ B

Men, det här blir inte så bra om A = B och det bör man i så fall försäkra sig aldrig händer.  Sker det förstörs innehållet i båda registren. Därför bör man villkora att man inte utför operationen om båda registren innehåller samma värde. Det innebär dock fler operationer.

Muahaha

World domination in 12 easy steps.

Tags: ,

2 Responses to Swapping variables

  1. Jonas says:

    A, B = B, A

    och som vanligt så är det såklart Ruby. Om det sedan verkligen kokar ner till en enda XCHG instruktion på x86 så skulle det förvåna mig.

  2. Ichimusai says:

    Ja, självklart, Ruby är perfekt för att göra sådana här saker och implementation av en exempelvis Knuth-Fisher-Yates shuffle blir ju ren poesi i Ruby måste jag säga.

    Om det är något språk man skall lära sig i dag för att få ett modernt perspektiv på programmering skulle jag rekommendera Ruby direkt.

    Av vad jag sett hittills innehåller det de bästa sakerna från Python, Perl, Pike osv men inte så många av knasigheterna utan är ganska lätt att komma igång med.

Leave a Reply

Name and Email Address are required fields. Your email will not be published or shared with third parties.

 

You can add images to your comment by clicking here.

Anti-Spam Protection by WP-SpamFree