Fondamentalmente, il comportamento si ottiene quando si superano gli interi con sottrazione, ma per un dato numero di bit. Il modo più ovvio, assumendo una firmato intero:Sottrazione di interi con wrap around per N bit
template <int BITS>
int sub_wrap(int v, int s) {
int max = (1<<(BITS));
v -= s;
if (v < -max) v += max*2;
// or if branching is bad, something like:
// v += (max*2) * (v < -max)
return v;
}
// For example subtracting 24 from -16 with 5 bit wrap,
// with a range of -32, 31
sub_wrap<5>(-16, 28); -> 20
C'è un modo pulito di farlo che è meno brutto e preferibilmente più veloce di quello di cui sopra?
AGGIORNAMENTO: Mi dispiace per la confusione. Ho incluso senza pensieri la notazione confusa dell'uso del numero di bit escludendo il bit di sigh. Quindi, in precedenza, sostituisci 5 bit con 6 bit per una maggiore sanità mentale.
È inoltre necessario verificare la presenza di 'v> = max'. – interjay
Un intervallo da -32 a 31 richiede 6 bit, non 5. – TonyK
Dipende interamente dal tuo punto di vista. Sono solo abituato a denotare il numero di bit escludendo il segno nel codice che sto usando attualmente, ma immagino che sia solo confusionario. – porgarmingduod