Esta es la contestación más correcta que encomtrarás aportar, pero primero obsérvala detenidamente y analiza si es compatible a tu proyecto.
Solución:
De Bit Twiddler Hacks:
int v; // we want to find the absolute value of v
unsigned int r; // the result goes here
int const mask = v >> sizeof(int) * CHAR_BIT - 1;
r = (v + mask) ^ mask;
int abs(int v)
return v * ((v>0) - (v<0));
Este código multiplica el valor de v
con -1
o 1
para obtener abdominales (v). Por lo tanto, dentro del paréntesis estará uno de -1
o 1
.
Si v
es positivo, la expresión (v>0)
es true y tendrá el valor 1
tiempo (v<0)
es false (con valor 0 para false). Por lo tanto, cuando v
es positivo ((v>0) - (v<0)) = (1-0) = 1
. Y toda la expresión es: v * (1) == v
.
Si v
es negativo, la expresión (v>0)
es false y tendrá el valor 0
tiempo (v<0)
es true (valor 1). Así, para negativo v
, ((v>0) - (v<0)) = (0-1) = -1
. Y toda la expresión es: v * (-1) == -v
.
Cuando v == 0
ambas cosas (v<0)
y (v>0)
evaluará a 0, dejando: v * 0 == 0
.
Sin sucursales:
int abs (int n)
const int ret[2] = n, -n ;
return ret [n<0];
Nota 4.7 Conversiones Integrales / 4:[...] If the source type is bool, the value false is converted to zero and the value true is converted to one.
Si conservas algún reparo o capacidad de enriquecer nuestro artículo te recordamos añadir un exégesis y con gusto lo analizaremos.