# Compute the integer absolute value (abs) without branching

We need not to do anything if a number is positive. We want to change only negative numbers. Since negative numbers are stored in 2’s complement form, to get the absolute value of a negative number we have to toggle bits of the number and add 1 to the result.

For example -2 in a 8 bit system is stored as follows 1 1 1 1 1 1 1 0 where leftmost bit is the sign bit. To get the absolute value of a negative number, we have to toggle all bits and add 1 to the toggled number i.e, 0 0 0 0 0 0 0 1 + 1 will give the absolute value of 1 1 1 1 1 1 1 0. Also remember, we need to do these operations only if the number is negative (sign bit is set).

**Method 1**

1) Set the mask as right shift of integer by 31 (assuming integers are stored using 32 bits).

mask = n>>31

2) For negative numbers, above step sets mask as 1 1 1 1 1 1 1 1 and 0 0 0 0 0 0 0 0 for positive numbers. Add the mask to the given number.

mask + n

3) XOR of mask +n and mask gives the absolute value.

(mask + n)^mask

Implementation:

## C++

`#include <bits/stdc++.h> ` `using` `namespace` `std; ` `#define CHARBIT 8 ` ` ` `/* This function will return absolute value of n*/` `unsigned ` `int` `getAbs(` `int` `n) ` `{ ` ` ` `int` `const` `mask = n >> (` `sizeof` `(` `int` `) * CHARBIT - 1); ` ` ` `return` `((n + mask) ^ mask); ` `} ` ` ` `/* Driver program to test above function */` `int` `main() ` `{ ` ` ` `int` `n = -6; ` ` ` `cout << ` `"Absoute value of "` `<< n << ` `" is "` `<< getAbs(n); ` ` ` `return` `0; ` `} ` ` ` `// This code is contributed by rathbhupendra ` |

*chevron_right*

*filter_none*

## C

`#include <stdio.h> ` `#define CHAR_BIT 8 ` ` ` `/* This function will return absolute value of n*/` `unsigned ` `int` `getAbs(` `int` `n) ` `{ ` ` ` `int` `const` `mask = n >> (` `sizeof` `(` `int` `) * CHAR_BIT - 1); ` ` ` `return` `((n + mask) ^ mask); ` `} ` ` ` `/* Driver program to test above function */` `int` `main() ` `{ ` ` ` `int` `n = -6; ` ` ` `printf` `(` `"Absoute value of %d is %u"` `, n, getAbs(n)); ` ` ` ` ` `getchar` `(); ` ` ` `return` `0; ` `} ` |

*chevron_right*

*filter_none*

## Java

`// Java implementation of above approach ` `class` `GFG { ` ` ` ` ` `static` `final` `int` `CHAR_BIT = ` `8` `; ` ` ` `static` `final` `int` `SIZE_INT = ` `8` `; ` ` ` ` ` `/* This function will return absolute value of n*/` ` ` `static` `int` `getAbs(` `int` `n) ` ` ` `{ ` ` ` `int` `mask = n >> (SIZE_INT * CHAR_BIT - ` `1` `); ` ` ` `return` `((n + mask) ^ mask); ` ` ` `} ` ` ` ` ` `/* Driver code */` ` ` `public` `static` `void` `main(String[] args) ` ` ` `{ ` ` ` `int` `n = -` `6` `; ` ` ` `System.out.print(` `"Absoute value of "` `+ n + ` `" is "` `+ getAbs(n)); ` ` ` `} ` `} ` ` ` `// This code is contributed by Rajput-Ji ` |

*chevron_right*

*filter_none*

## Python3

`# Python3 implementation of above approach ` `CHARBIT ` `=` `8` `; ` `SIZE_INT ` `=` `8` `; ` ` ` `# This function will return ` `# absolute value of n ` `def` `getAbs(n): ` ` ` `mask ` `=` `n >> (SIZE_INT ` `*` `CHARBIT ` `-` `1` `); ` ` ` `return` `((n ` `+` `mask) ^ mask); ` ` ` `# Driver Code ` `n ` `=` `-` `6` `; ` `print` `(` `"Absolute value of"` `,n,` `"is"` `,getAbs(n)); ` ` ` `# This code is contributed by mits ` |

*chevron_right*

*filter_none*

## C#

`// C# implementation of above approach ` `using` `System; ` ` ` `class` `GFG { ` ` ` ` ` `static` `int` `CHAR_BIT = 8; ` ` ` `static` `int` `SIZE_INT = 8; ` ` ` ` ` `/* This function will return absolute value of n*/` ` ` `static` `int` `getAbs(` `int` `n) ` ` ` `{ ` ` ` `int` `mask = n >> (SIZE_INT * CHAR_BIT - 1); ` ` ` `return` `((n + mask) ^ mask); ` ` ` `} ` ` ` ` ` `/* Driver code */` ` ` `static` `void` `Main() ` ` ` `{ ` ` ` `int` `n = -6; ` ` ` `Console.Write(` `"Absoute value of "` `+ n + ` `" is "` `+ getAbs(n)); ` ` ` `} ` `} ` ` ` `// This code is contributed by mits ` |

*chevron_right*

*filter_none*

## PHP

`<?php ` `// PHP implementation of above approach ` `$CHARBIT` `= 8; ` `$SIZE_INT` `= 8; ` ` ` `// This function will return ` `// absolute value of n ` `function` `getAbs(` `$n` `) ` `{ ` ` ` `global` `$SIZE_INT` `, ` `$CHARBIT` `; ` ` ` `$mask` `= ` `$n` `>> (` `$SIZE_INT` `* ` `$CHARBIT` `- 1); ` ` ` `return` `((` `$n` `+ ` `$mask` `) ^ ` `$mask` `); ` `} ` ` ` `// Driver Code ` `$n` `= -6; ` `echo` `"Absolute value of "` `. ` `$n` `. ` ` ` `" is "` `. getAbs(` `$n` `); ` ` ` `// This code is contributed by mits ` `?> ` |

*chevron_right*

*filter_none*

**Output:**

Absolute value of -6 is 6

**Method 2:**

1) Set the mask as right shift of integer by 31 (assuming integers are stored using 32 bits).

mask = n>>31

2) XOR the mask with number

mask ^ n

3) Subtract mask from result of step 2 and return the result.

(mask^n) - mask

Implementation:

`/* This function will return absolute value of n*/` `unsigned ` `int` `getAbs(` `int` `n) ` `{ ` ` ` `int` `const` `mask = n >> (` `sizeof` `(` `int` `) * CHAR_BIT - 1); ` ` ` `return` `((n ^ mask) - mask); ` `} ` |

*chevron_right*

*filter_none*

On machines where branching is expensive, the above expression can be faster than the obvious approach, r = (v < 0) ? -(unsigned)v : v, even though the number of operations is the same.

Please see this for more details about the above two methods.

Please write comments if you find any of the above explanations/algorithms incorrect, or a better ways to solve the same problem.

**References:**

http://graphics.stanford.edu/~seander/bithacks.html#IntegerAbs

Don’t stop now and take your learning to the next level. Learn all the important concepts of Data Structures and Algorithms with the help of the most trusted course: **DSA Self Paced**. Become industry ready at a student-friendly price.

## Recommended Posts:

- Check for Integer Overflow
- Count set bits in an integer
- Compute the minimum or maximum of two integers without branching
- Compute modulus division by a power-of-2-number
- Multiply a given Integer with 3.5
- How to swap two bits in a given integer?
- Next greater integer having one more number of set bits
- Previous smaller integer having one less number of set bits
- Compute the parity of a number using XOR and table look-up
- Find One's Complement of an Integer
- Count set bits in an integer using Lookup Table
- Minimum numbers needed to express every integer below N as a sum
- Minimum absolute difference between N and a power of 2
- Find closest integer with the same weight
- Cyclic shifts of integer N by another integer m
- Choose an integer K such that maximum of the xor values of K with all Array elements is minimized
- Find the largest number smaller than integer N with maximum number of set bits
- Absolute difference between set and unset bit count in N