c++ - residuo - que es el modulo de un numero en programacion
Operación matemática para mantener un número no inferior a cero (5)
En la programación, el módulo es útil para mantener los números en el rango que no exceda un límite límite superior.
Por ejemplo:
int value = 0;
for (int x=0; x<100; x++)
cout << value++%8 << " "; //Keeps number in range 0-7
Salida: 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7...
Ahora considere esta situación:
int value = 5;
for (int x=0; x<100; x++)
cout << value-- << " ";
Salida: 5 4 3 2 1 0 -1 -2 -3 -4 -5 -6 -7...
Mi pregunta es: ¿Cómo establecer el límite límite inferior en 0 SIN usar ningún enunciado condicional como if o switch case?
Salida que quiero: 5 4 3 2 1 0 0 0 0 0 0 0 ...
¿Qué tal std::max
?
int value = 5;
for (int x=0; x<100; x++) {
cout << value << " ";
value = std::max(0, --value);
}
Las dos situaciones son diferentes. Como has demostrado, el %
hará que los números vayan de 0
a 7
, mientras que en el caso negativo parece que estás pidiendo el max
.
Dependiendo de si considera el operador ternario como un condicional, podría hacer:
int value = 5;
for (int x=0; x<100; x++)
cout << value > 0 ? value-- : 0 << " ";
Esto tiene el efecto secundario de que el value
ya no disminuirá una vez que haya llegado a 0
.
Alternativamente, puede usar un std::max
:
int value = 5;
for (int x=0; x<100; x++)
cout << std::max(0, value--) << " ";
Tal vez se puede hacer con
typedef unsigned u32b;
u32b sat_subu32b(u32b x, u32b y)
{
u32b res = x - y;
res &= -(res <= x);
return res;
}
que se toma de aquí . Más específicamente, parece implementar una resta saturada; la disminución saturada sería
u32b sat_dec(u32bx)
{
u32b res = x-1;
res &= -(res <= x);
return res;
}
y parece estar libre de ramificaciones.
Use std::max(value,0)
o el operador ternario. Ambos compilarán para codificar sin saltos condicionales.
usando la función max
en std
.
detalle max
función :
template <class T> const T& max (const T& a, const T& b) {
return (a<b)?b:a;
}