Page 1 of 1

Intrebare !

Posted: 16 Sep 2017, 12:20
by aiwa
Salut . Am o intrebare la care as vrea sa ma ajutati .. De exemplu declar 2 variabile int .. Cum as putea afisa care dintre ele e minimul si care e maximul fara a folosi cicluri : for , dowhile, while , if , etc etc. ? Am intrebat de multa lume dar nu am gasit inca raspuns.

Re: Intrebare !

Posted: 16 Sep 2017, 18:00
by Viorel
În cazul variabilelor obișnuite de 32 de biți, încearcă această soluție:

Code: Select all

int variabila1 = 10;
int variabila2 = 20;

int valori[] = { variabila1, variabila2 };

int minimul = valori[unsigned( variabila2 - variabila1 ) >> 31];
int maximul = valori[unsigned( variabila1 - variabila2 ) >> 31];

Re: Intrebare !

Posted: 18 Sep 2017, 16:56
by aiwa
Totul merge foarte bine .. Dar imi poti explica te rog fiecare linie ? Fiecare detaliu ?a

Re: Intrebare !

Posted: 19 Sep 2017, 09:01
by Marius Bancila
Daca variabila2 > variabila1, atunci expresia variabila2 - variabila1 e pozitiva. Astea inseamna ca cel mai semnificativ bit, cel de semn, e 0. Prin shiftarea la dreapta cu 31 de pozitii, ramane doar bitul de semn, adica zero. Prin urmare, unsigned( variabila2 - variabila1 ) >> 31 va fi egala cu 0, iar minimul este valori[0], adica variabila 1. In aceleasi conditii, expresia variabila1 - variabila2 e negativa. Astea inseamna ca cel mai semnificativ bit, cel de semn, e 1. Prin shiftarea la dreapta cu 31 de pozitii acest bit de 1 ajunge pe cel mai putin semnificativ bit, si valoarea rezultata, de tip unsigned, e 1. Maximul va fi egal cu valori[1], adica cu variabila2.

Daca variabila 1 < variabila2, minimul si maximul vor fi exact invers.

Re: Intrebare !

Posted: 19 Sep 2017, 17:04
by aiwa
Merci mult am inteles, o chestie care inca nu imi este clara: de ce `unsigned(expression)` ce face el? nu ar trebui sa transforme numarul in unul fara semn?
si least significant bit mereu sa fie pozitiv, adica `0`?

merci