VOOZH about

URL: https://www.geeksforgeeks.org/dsa/compute-the-minimum-or-maximum-max-of-two-integers-without-branching/

⇱ Compute the minimum or maximum of two integers without branching - GeeksforGeeks


  • Courses
  • Tutorials
  • Interview Prep

Compute the minimum or maximum of two integers without branching

Last Updated : 26 Jun, 2023

On some rare machines where branching is expensive, the below obvious approach to find minimum can be slow as it uses branching.

Below are the methods to get minimum(or maximum) without using branching. Typically, the obvious approach is best, though.

Method 1(Use XOR and comparison operator)
Minimum of x and y will be 

y ^ ((x ^ y) & -(x < y))

It works because if x < y, then -(x < y) will be -1 which is all ones(11111....), so r = y ^ ((x ^ y) & (111111...)) = y ^ x ^ y = x. 

And if x>y, then-(x<y) will be -(0) i.e -(zero) which is zero, so r = y^((x^y) & 0) = y^0 = y.

On some machines, evaluating (x < y) as 0 or 1 requires a branch instruction, so there may be no advantage.
To find the maximum, use 

x ^ ((x ^ y) & -(x < y));

Output
Minimum of 15 and 6 is 6
Maximum of 15 and 6 is 15

Time Complexity: O(1)
Auxiliary Space: O(1)


Method 2(Use subtraction and shift)
If we know that 

INT_MIN <= (x - y) <= INT_MAX

, then we can use the following, which are faster because (x - y) only needs to be evaluated once. 
Minimum of x and y will be 

y + ((x - y) & ((x - y) >>(sizeof(int) * CHAR_BIT - 1)))

This method shifts the subtraction of x and y by 31 (if size of integer is 32). If (x-y) is smaller than 0, then (x -y)>>31 will be 1. If (x-y) is greater than or equal to 0, then (x -y)>>31 will be 0. 
So if x >= y, we get minimum as y + (x-y)&0 which is y. 
If x < y, we get minimum as y + (x-y)&1 which is x.
Similarly, to find the maximum use 

x - ((x - y) & ((x - y) >> (sizeof(int) * CHAR_BIT - 1)))

Output
Minimum of 15 and 6 is 6
Maximum of15 and 6 is 15

Time Complexity: O(1)
Auxiliary Space: O(1)

Comment
Article Tags: