Subiectul anterior :: Subiectul următor |
Autor |
Mesaj |
Sava Stan Senior activ
Vârsta: 77 Data înscrierii: 16/Apr/2007 Mesaje: 141 Cuvinte scrise: 18,650 Sexul:
Locație: Buzau
|
Trimis: Vin Sep 21, 2007 4:04 pm Titlul subiectului: Interschimbare valori |
|
|
Există numeroase cazuri în programare când valorile a două variabile numerice trebuiesc inversate. Pentru aceasta, cel mai adesea, se folosește o variabilă auxiliară. De exemplu:
int a,b;
int aux;
a=1234;
b=5678;
//Inversăm a cu b
aux=a;
a=b;
b=aux
Există însă și posibilitatea de a inversa valorile a două variabile fără a folosi o variabilă auxiliară, tot în trei pași, și fără a folosi vreo eventuală funcţie specializată.
Cum ? |
|
Sus |
|
|
Sava Stan Senior activ
Vârsta: 77 Data înscrierii: 16/Apr/2007 Mesaje: 141 Cuvinte scrise: 18,650 Sexul:
Locație: Buzau
|
Trimis: Mar Sep 25, 2007 6:44 am Titlul subiectului: Interschimbare valori |
|
|
Văd că nu se înghesuie nimeni cu un răspuns. Așa că n-o să mai prelungesc așteptarea. Ce părere aveți de:
a^=b;
b^=a;
a^=b;
? |
|
Sus |
|
|
nadiut Junior
Vârsta: 38 Data înscrierii: 22/Mar/2007 Mesaje: 12 Cuvinte scrise: 1,684 Sexul:
|
Trimis: Joi Sep 27, 2007 12:58 pm Titlul subiectului: (Fără titlu) |
|
|
a=a XOR b;
b=b XOR a;
a=a XOR b;
dar are dezavantajul ca se poate face doar pt numere intregi si pot aparea pb cu semnele |
|
Sus |
|
|
icarus86 Junior activ
Vârsta: 38 Data înscrierii: 02/Apr/2007 Mesaje: 33 Cuvinte scrise: 1,966 Sexul:
Locație: /dev/null
|
Trimis: Lun Oct 01, 2007 11:51 pm Titlul subiectului: (Fără titlu) |
|
|
Salut,
A = A - B
B = A + B
A = B - A
Merge cu orice
Rares _________________ 0x2b | ~0x2b = ... 0xFF ! |
|
Sus |
|
|
nadiut Junior
Vârsta: 38 Data înscrierii: 22/Mar/2007 Mesaje: 12 Cuvinte scrise: 1,684 Sexul:
|
Trimis: Mie Oct 03, 2007 8:18 pm Titlul subiectului: (Fără titlu) |
|
|
merge cu orice, dar nu neaparat sa mearga si corect, depinde de limitele pe care le are tipul variabilelor. de ex. daca sunt in intervalul 0..65535, si A=65533 si B=65534, nu da bine |
|
Sus |
|
|
benishor Junior activ
Vârsta: 43 Data înscrierii: 31/Mar/2007 Mesaje: 35 Cuvinte scrise: 4,492 Sexul:
Locație: brasov
|
Trimis: Mar Iul 08, 2008 4:21 pm Titlul subiectului: (Fără titlu) |
|
|
nadiut a scris: | dar are dezavantajul ca se poate face doar pt numere intregi si pot aparea pb cu semnele |
De regula trick-ul asta se folosea in asm, laolalta cu inlocuirea unui imul cu suma de shifturi al caror total de cicluri era mai mic decat al unui singur imul. Acum insa nu prea mai castigi nimic.
Pe scurt, in asm se facea trickul de mai sus in cazul numerelor cu virgula mobila executand suita de xoruri asupra locatiei valorilor ( un pointer are de regula 32 biti, mai putin in cazul sistemelor prea noi sau mult prea vechi ). _________________ trees don't hit cars unless in selfdefence |
|
Sus |
|
|
Sava Stan Senior activ
Vârsta: 77 Data înscrierii: 16/Apr/2007 Mesaje: 141 Cuvinte scrise: 18,650 Sexul:
Locație: Buzau
|
Trimis: Mar Iul 08, 2008 6:30 pm Titlul subiectului: Interschimbare valori |
|
|
benishor a scris: | nadiut a scris: | dar are dezavantajul ca se poate face doar pt numere intregi si pot aparea pb cu semnele |
De regula trick-ul asta se folosea in asm, laolalta cu inlocuirea unui imul cu suma de shifturi al caror total de cicluri era mai mic decat al unui singur imul. Acum insa nu prea mai castigi nimic.
Pe scurt, in asm se facea trickul de mai sus in cazul numerelor cu virgula mobila executand suita de xoruri asupra locatiei valorilor ( un pointer are de regula 32 biti, mai putin in cazul sistemelor prea noi sau mult prea vechi ). |
Fara indoiala ca "inspiratia" provine din ASSEMBLER (ehei, ASSIRIS, MAC80, Z80, s.a.m.d.) unde il foloseam pentru inversarea continutului a doi registri fara utilizarea de memorie suplimentara. Cand folosesti limbajul de asamblare ai in vedere, de regula, obtinerea unui cod cat mai scurt si cat mai rapid. De unde si economia. Observatiile unor "forumisti" legate de reprezentarea datelor avute in vedere sunt juste. |
|
Sus |
|
|
absolutep0wer Junior
Vârsta: 46 Data înscrierii: 11/Apr/2009 Mesaje: 14 Cuvinte scrise: 1,806 Sexul:
|
Trimis: Mar Apr 14, 2009 5:35 pm Titlul subiectului: (Fără titlu) |
|
|
Buna ziua,sunt nou pe forum si as vrea sa salut toti membrii. |
|
Sus |
|
|
absolutep0wer Junior
Vârsta: 46 Data înscrierii: 11/Apr/2009 Mesaje: 14 Cuvinte scrise: 1,806 Sexul:
|
Trimis: Joi Mai 21, 2009 10:59 pm Titlul subiectului: (Fără titlu) |
|
|
La multi ani pentru toti cei cu numele Constantin si Elena ! |
|
Sus |
|
|
|