Básicamente, el comportamiento que se obtiene al desbordar enteros con sustracción, pero para un número determinado de bits. La manera obvia, asumiendo una firmaron entero:resta entera con envoltura para N bits
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
¿Hay una clara forma de hacerlo que es menos feo y preferiblemente más rápida que la de arriba?
ACTUALIZACIÓN: Perdón por la confusión. Inconscientemente incluí la notación confusa de usar la cantidad de bits excluyendo el bit de suspiro. Entonces, en lo anterior, reemplace 5 bits con 6 bits para una mayor cordura.
También es necesario comprobar si hay 'v> = max'. – interjay
Un rango de -32 a 31 requiere 6 bits, no 5. – TonyK
Eso depende completamente de su punto de vista. Solo estoy acostumbrado a denotar el número de bits excluyendo el signo en el código que estoy usando actualmente, pero supongo que eso es simplemente confuso. – porgarmingduod