Go4Expert

Go4Expert (http://www.go4expert.com/)
-   C (http://www.go4expert.com/forums/c/)
-   -   ABS() function implementation (http://www.go4expert.com/forums/abs-function-implementation-t8714/)

sandeepchiks 8Feb2008 11:02

ABS() function implementation
 
Hi,

How can I write a code for ABS() function, without any condtion check?

Usually ABSOLUTE function is implemented as
int abs(int var)
{
if ( var < 0)
var = -var;
return var;
}

I do not want to have any conditional statement.

Thanks
Sandeep

shabbir 8Feb2008 14:59

Re: ABS() function implementation
 
Type cast it to unsigned int and then return the value

aperisic 12Feb2008 04:07

Re: ABS() function implementation
 
You can disguise but you can't easily remove if statement since the extraction from an integer is different if the number is positive or negative. This is one of the solutions that basically says: if number is negative do a bit-inversion after subtracting 1 from it, otherwise do nothing.
Code:

int my_abs(int x)
{
int t = (unsigned int)x >> 31;       
// t is 1 if x is negative
//otherwise it is 0

return (- t) ^ (x - t);       
// ^ is XOR and in if t is 1, - 1 will
//create 32 1's to invert x-1,
//otherwise x will not change
}

or equally,
Code:

int my_abs(int x)
{
int t = x >> 31;
// t is -1 if x is negative otherwise it is 0

return t ^ (x + t);
}


aperisic 13Feb2008 18:37

Re: ABS() function implementation
 
Of course we can create a template to get absolute value from any type of integers:
Code:

#define BYTE_SIZE 8
template <typename T>
T mabs(T x)
{
        T t = x >> (sizeof(T)*BYTE_SIZE - 1);
        return t ^ (x + t);
}

usage
Code:

long int z = mabs<long int>(-11547);
Now, it looks funny since it seems as if this can be used to get "absolute" value of any structure or class. It may but only if >> is defined. For example >> is not defined for double and float.


All times are GMT +5.5. The time now is 11:55.