Spesso nei miei loop interni ho bisogno di indicizzare un array in un modo "wrap-around", in modo che se la dimensione dell'array è 100 e il mio codice richiede l'elemento -2 , dovrebbe essere fornito l'elemento 98. In molti linguaggi di alto livello come Python, si può fare semplicemente con my_array[index % array_size]
, ma per qualche motivo l'intero aritmetico di C (di solito) arrotonda verso zero invece di arrotondare costantemente verso il basso, e di conseguenza il suo operatore modulo ritorna un risultato negativo quando viene dato un primo argomento negativo.Il modo più veloce per ottenere un modulo positivo in C/C++
Spesso so che lo index
non sarà inferiore a -array_size
e in questi casi faccio solo my_array[(index + array_size) % array_size]
. Tuttavia, a volte questo non può essere garantito, e per quei casi mi piacerebbe sapere il modo più veloce per implementare una funzione modulo sempre positiva. Ci sono diversi modi "intelligenti" per farlo senza ramificazione, come
inline int positive_modulo(int i, int n) {
return (n + (i % n)) % n
}
o
inline int positive_modulo(int i, int n) {
return (i % n) + (n * (i < 0))
}
Certo che posso profilo questi per scoprire quale è il più veloce sul mio sistema, ma posso Aiutatemi a preoccuparmi che possa essermi perso uno migliore, o che quello che è veloce sulla mia macchina potrebbe essere lento su uno diverso.
Quindi c'è un modo standard per fare questo, o qualche trucco intelligente che ho perso che è probabile che sia il modo più veloce possibile?
Inoltre, so che probabilmente è un pio desiderio, ma se c'è un modo per farlo che può essere auto-vettorializzato, sarebbe fantastico.
Stai modificando costantemente lo stesso numero? – Mysticial
@Mysticial in genere, sì. – Nathaniel
@Mysticial anche se la soluzione vincola il numero su cui sto modificando per essere una potenza di 2, va bene. – Nathaniel