Per qualsiasi numero intero ingresso W limitata dalla gamma R = [x, y], il "troppo pieno", per mancanza di un termine migliore, di W sopra R è W % (y-x+1) + x
. Ciò causa che si riavvolge se W supera y.Esiste un'espressione che utilizza modulo per eseguire il wrap-around all'indietro ("overflow inverso")?
Come esempio di questo principio, supponiamo iteriamo nel corso di mesi di un calendario:
int this_month = 5;
int next_month = (this_month + 1) % 12;
dove entrambi interi sarà compreso tra 0 e 11, inclusi. Pertanto, l'espressione sopra "blocca" l'intero nell'intervallo R = [0,11]. Questo approccio all'uso di un'espressione è semplice, elegante e vantaggioso in quanto omette la diramazione.
Ora, cosa succede se vogliamo fare la stessa cosa, ma all'indietro? La seguente espressione funziona:
int last_month = ((this_month - 1) % 12 + 12) % 12;
ma è astruso. Come può essere abbellito?
tl; dr - Può l'espressione ((x-1) % k + k) % k
essere ulteriormente semplificata?
Nota: tag C++ specificato perché altri linguaggi gestiscono gli operandi negativi per l'operatore modulo in modo diverso.
'((x-1) + k)% k' è la soluzione! – CpILL
Il numero '-1' non può essere inferiore a' - (k-1) ' –