Sono bloccato lì cercando di capire come convertire le ultime due istruzioni "if" del codice seguente in uno stato senza ramo.Conversione a diramazioni if if consecutive
int u, x, y;
x = rand() % 100 - 50;
y = rand() % 100 - 50;
u = rand() % 4;
if (y > x) u = 5;
if (-y > x) u = 4;
Oppure, nel caso in cui quanto sopra risulta essere troppo difficile, si può considerare loro come:
if (x > 0) u = 5;
if (y > 0) u = 4;
penso che quello che mi viene è il fatto che coloro che non hanno un else
Catcher. Se fosse il caso, avrei probabilmente potuto adattare una variante di una funzione senza ramo abs
(o max
/min
).
Le funzioni rand()
visualizzate non fanno parte del codice reale. Li ho aggiunti in questo modo solo per suggerire gli intervalli previsti che le variabili e u
possono avere nel momento in cui i due rami si verificano.
Il codice macchina di assemblaggio è consentito per lo scopo.
EDIT:
Dopo un po 'di braingrinding sono riuscito a mettere insieme una versione senza rami di lavoro:
int u, x, y;
x = rand() % 100 - 50;
y = rand() % 100 - 50;
u = rand() % 4;
u += (4-u)*((unsigned int)(x+y) >> 31);
u += (5-u)*((unsigned int)(x-y) >> 31);
Purtroppo, a causa della aritmetica intera coinvolta, la versione originale con se le dichiarazioni risulta essere più veloce di un intervallo del 30%.
Il compilatore sa dove si trova la festa.
È possibile utilizzare x e y altrove? Altrimenti, ognuna di queste linee potrebbe essere 'if (rand()% 2) ...'. –
'u + = (5 - u) * (y> x);'? –
@OliverCharlesworth vedo. Sì, sono usati altrove. – user2464424