Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: C++: XOR swap

Sivun loppuun

iluwatar [20.06.2004 17:18:12]

#

Vaihtaa kahden luvun arvot käyttämättä tilapäismuuttujaa.

// funktio vaihtaa annettujen lukujen arvot
// käyttämättä tilapäismuuttujaa
void XorSwap(int& a, int& b)
{
  a ^= b;
  b ^= a;
  a ^= b;
}

peki [21.06.2004 12:01:09]

#

a = 5
b = 8

silloin a on binaarina: 0101
ja b on binaarina: 1000

a = a xor b
b = b xor a
a = a xor b

0101
1000
----------
1101

1000
1101
----------
0101

1101
0101
----------
1000

Nyt ne on siis swapattu.

BlueByte [22.06.2004 05:34:58]

#

Aika jännä.

ajv [22.06.2004 08:35:44]

#

No pakko sanoa tähän, että WANHA!
Kätevähän tämä on. Jossei muuta, niin pääsee pätemään c-kielen tunnilla kuten allekirjoittanut :P

hunajavohveli [22.06.2004 09:27:00]

#

Kätevää, ja mitään tilapäismuuttujaa ei näin siis todellakaan tarvita.

sooda [22.06.2004 13:36:40]

#

Kätevä, mutta wanha.

tejeez [22.06.2004 22:27:53]

#

Tällaset on kyl aika turhia. :|

Linkku [03.05.2005 16:46:33]

#

Tämä swap on hieman monikäyttöisempi

template<typename T>
inline void
swap( T *t1, T *t2 ) {
    t1 ^= t2;
    t2 ^= t1;
    t1 ^= t2;
}

Deewiant [05.05.2005 16:26:14]

#

Kunhan muistetaan, että tilapäismuuttujan käyttö on useimmiten nopeampaa. Nykyajan prosessorit nimittäin pyrkivät tekemään mahdollisimman paljon asioita yhtä aikaa. Eli jos meillä on vaikka:

int temp = a;
a = b;
b = temp;

Ensimmäiset (vai toiset? en ole täysin varma) kaksi lauseketta voidaan ajaa samanaikaisesti. Mutta XOR-swapissa kaikkien lausekkeiden arvot riippuvat edellisen arvosta, joten ne täytyy ajaa peräjälkeen, eikä samaan aikaan.

JoinTuanJanohon [29.11.2005 00:00:40]

#

Niin, ja sitten yksi aika tärkeä juttu on jäänyt huomaamatta, ku xor:ia käytetään arvojen swappaamiseen.

Jos a ja b ovat saman muuttujan aliaksia, tai pointtereita, niin silloin ensimmäinen xor-operaatio lykkää molemmat muuttujat nolliksi.

Sitten xor:lla swapattaessa pitää muistaa, ettei samoja aliaksia tai samoissa pointtereissa olevia arvoja rupea xooraamaan.

Eikä tää musta mikään kovin vanha juttu oo. Päinvastoin, moni koodaaja törmää tähän vasta pitkän pitkän ajan perästä. Eiköhän se oo paremminkin niin päin, että ku jos o sitä mieltä, että tää on vanha juttu, niin sitte päinvastoin itellä ei vielä kauheasti oo kokokemusta koodaamisesta, ja sittenhän on hirmu tärkeää päteä, että toi, toi ja toi on vanhaa.

qsortinkin voi ajaa niin silmittömän tehokkaasti, että oksat pois. Varmaa, ku joku sitte sen optimoinnin joskus näissä tosi hyvissä koodivinkeissä esittää, niin heti ensimmäiset näsäviisaat o sanomas, että toihan o vanha juttu, vaikka ei tajua asiasta höläykse pölyä.

Deffi [10.04.2008 21:29:40]

#

__asm ("movl  %0, %%eax\n"
       "xchgl %%eax, %1\n"
       "movl  %%eax, %0\n": : "m"(dwValue1), "m"(dwValue2) : "%eax");

:)


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta