Related Articles

Related Articles

Compute the minimum or maximum of two integers without branching
  • Difficulty Level : Hard
  • Last Updated : 25 Jul, 2019

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

filter_none

edit
close

play_arrow

link
brightness_4
code

/* The obvious approach to find minimum (involves branching) */
int min(int x, int y)
{
  return (x < y) ? x : y
}

chevron_right


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, then -(x < y) will be all zeros, so r = y ^ ((x ^ 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));

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ program to Compute the minimum
// or maximum of two integers without 
// branching
#include<iostream>
using namespace std;
  
class gfg
{
      
    /*Function to find minimum of x and y*/
    public:
    int min(int x, int y)
    {
        return y ^ ((x ^ y) & -(x < y));
    }
  
    /*Function to find maximum of x and y*/
    int max(int x, int y)
    {
        return x ^ ((x ^ y) & -(x < y)); 
    }
    };
      
    /* Driver code */
    int main()
    {
        gfg g;
        int x = 15;
        int y = 6;
        cout << "Minimum of " << x <<
             " and " << y << " is ";
        cout << g. min(x, y);
        cout << "\nMaximum of " << x << 
                " and " << y << " is ";
        cout << g.max(x, y);
        getchar();
    }
  
// This code is contributed by SoM15242

chevron_right


C

filter_none

edit
close

play_arrow

link
brightness_4
code

// C program to Compute the minimum
// or maximum of two integers without 
// branching
#include<stdio.h>
  
/*Function to find minimum of x and y*/
int min(int x, int y)
{
return y ^ ((x ^ y) & -(x < y));
}
  
/*Function to find maximum of x and y*/
int max(int x, int y)
{
return x ^ ((x ^ y) & -(x < y)); 
}
  
/* Driver program to test above functions */
int main()
{
int x = 15;
int y = 6;
printf("Minimum of %d and %d is ", x, y);
printf("%d", min(x, y));
printf("\nMaximum of %d and %d is ", x, y);
printf("%d", max(x, y));
getchar();
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java program to Compute the minimum
// or maximum of two integers without 
// branching
public class AWS {
  
    /*Function to find minimum of x and y*/
    static int min(int x, int y)
    {
    return y ^ ((x ^ y) & -(x << y));
    }
      
    /*Function to find maximum of x and y*/
    static int max(int x, int y)
    {
    return x ^ ((x ^ y) & -(x << y)); 
    }
      
    /* Driver program to test above functions */
    public static void main(String[] args) {
          
        int x = 15;
        int y = 6;
        System.out.print("Minimum of "+x+" and "+y+" is ");
        System.out.println(min(x, y));
        System.out.print("Maximum of "+x+" and "+y+" is ");
        System.out.println( max(x, y));
    }
  
}

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python3 program to Compute the minimum
# or maximum of two integers without 
# branching
  
# Function to find minimum of x and y
  
def min(x, y):
  
    return y ^ ((x ^ y) & -(x < y))
  
  
# Function to find maximum of x and y
def max(x, y):
  
    return x ^ ((x ^ y) & -(x < y)) 
  
  
# Driver program to test above functions 
x = 15
y = 6
print("Minimum of", x, "and", y, "is", end=" ")
print(min(x, y))
print("Maximum of", x, "and", y, "is", end=" ")
print(max(x, y))
  
# This code is contributed
# by Smitha Dinesh Semwal

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

using System;
  
// C# program to Compute the minimum 
// or maximum of two integers without  
// branching 
public class AWS
{
  
    /*Function to find minimum of x and y*/
    public  static int min(int x, int y)
    {
    return y ^ ((x ^ y) & -(x << y));
    }
  
    /*Function to find maximum of x and y*/
    public  static int max(int x, int y)
    {
    return x ^ ((x ^ y) & -(x << y));
    }
  
    /* Driver program to test above functions */
    public static void Main(string[] args)
    {
  
        int x = 15;
        int y = 6;
        Console.Write("Minimum of " + x + " and " + y + " is ");
        Console.WriteLine(min(x, y));
        Console.Write("Maximum of " + x + " and " + y + " is ");
        Console.WriteLine(max(x, y));
    }
  
}
  
  // This code is contributed by Shrikant13

chevron_right


PHP

filter_none

edit
close

play_arrow

link
brightness_4
code

<?php
// PHP program to Compute the minimum
// or maximum of two integers without 
// branching
  
// Function to find minimum
// of x and y
function m_in($x, $y)
{
    return $y ^ (($x ^ $y) & 
            - ($x < $y));
}
  
// Function to find maximum 
// of x and y
function m_ax($x, $y)
{
    return $x ^ (($x ^ $y) & 
            - ($x < $y)); 
}
  
// Driver Code
$x = 15;
$y = 6;
echo"Minimum of"," ", $x," ","and"
    " ",$y," "," is "," ";
      
echo m_in($x, $y);
  
echo "\nMaximum of"," ",$x," ",
    "and"," ",$y," ", " is ";
      
echo m_ax($x, $y);
  
// This code is contributed by anuj_67.
?>
  

chevron_right



Output:

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

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)))

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

#include <bits/stdc++.h>
using namespace std;
#define CHARBIT 8 
  
/*Function to find minimum of x and y*/
int min(int x, int y) 
    return y + ((x - y) & ((x - y) >> 
            (sizeof(int) * CHARBIT - 1))); 
  
/*Function to find maximum of x and y*/
int max(int x, int y) 
    return x - ((x - y) & ((x - y) >> 
            (sizeof(int) * CHARBIT - 1))); 
  
/* Driver code */
int main() 
    int x = 15; 
    int y = 6; 
    cout<<"Minimum of "<<x<<" and "<<y<<" is "
    cout<<min(x, y); 
    cout<<"\nMaximum of"<<x<<" and "<<y<<" is ";
    cout<<max(x, y); 
  
// This code is contributed by rathbhupendra

chevron_right


C

filter_none

edit
close

play_arrow

link
brightness_4
code

#include<stdio.h>
#define CHAR_BIT 8
  
/*Function to find minimum of x and y*/
int min(int x, int y)
{
  return  y + ((x - y) & ((x - y) >> 
            (sizeof(int) * CHAR_BIT - 1))); 
}
  
/*Function to find maximum of x and y*/
int max(int x, int y)
{
  return x - ((x - y) & ((x - y) >>
            (sizeof(int) * CHAR_BIT - 1)));
}
  
/* Driver program to test above functions */
int main()
{
  int x = 15;
  int y = 6;
  printf("Minimum of %d and %d is ", x, y);
  printf("%d", min(x, y));
  printf("\nMaximum of %d and %d is ", x, y);
  printf("%d", max(x, y));
  getchar();
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// JAVA implementation of above approach
class GFG
{
      
static int CHAR_BIT = 4;
static int INT_BIT = 8;
/*Function to find minimum of x and y*/
static int min(int x, int y)
{
    return y + ((x - y) & ((x - y) >> 
                (INT_BIT * CHAR_BIT - 1))); 
}
  
/*Function to find maximum of x and y*/
static int max(int x, int y)
{
    return x - ((x - y) & ((x - y) >>
            (INT_BIT * CHAR_BIT - 1)));
}
  
/* Driver code */
public static void main(String[] args)
{
    int x = 15;
    int y = 6;
    System.out.println("Minimum of "+x+" and "+y+" is "+min(x, y));
    System.out.println("Maximum of "+x+" and "+y+" is "+max(x, y));
}
}
  
// This code is contributed by 29AjayKumar

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python3 implementation of the approach
import sys;
      
CHAR_BIT = 8
INT_BIT = sys.getsizeof(int()); 
  
#Function to find minimum of x and y
def Min(x, y): 
    return y + ((x - y) & ((x - y) >> 
                (INT_BIT * CHAR_BIT - 1))); 
  
#Function to find maximum of x and y
def Max(x, y): 
    return x - ((x - y) & ((x - y) >> 
                (INT_BIT * CHAR_BIT - 1))); 
  
# Driver code 
x = 15
y = 6
print("Minimum of", x, "and"
                    y, "is", Min(x, y)); 
print("Maximum of", x, "and",
                    y, "is", Max(x, y)); 
  
# This code is contributed by PrinciRaj1992 

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# implementation of above approach
using System;
  
class GFG
{
      
static int CHAR_BIT = 8;
  
/*Function to find minimum of x and y*/
static int min(int x, int y)
{
    return y + ((x - y) & ((x - y) >> 
                (sizeof(int) * CHAR_BIT - 1))); 
}
  
/*Function to find maximum of x and y*/
static int max(int x, int y)
{
    return x - ((x - y) & ((x - y) >>
            (sizeof(int) * CHAR_BIT - 1)));
}
  
/* Driver code */
static void Main()
{
    int x = 15;
    int y = 6;
    Console.WriteLine("Minimum of "+x+" and "+y+" is "+min(x, y));
    Console.WriteLine("Maximum of "+x+" and "+y+" is "+max(x, y));
}
}
  
// This code is contributed by mits

chevron_right



Note that the 1989 ANSI C specification doesn’t specify the result of signed right-shift, so above method is not portable. If exceptions are thrown on overflows, then the values of x and y should be unsigned or cast to unsigned for the subtractions to avoid unnecessarily throwing an exception, however the right-shift needs a signed operand to produce all one bits when negative, so cast to signed there.

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

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.




My Personal Notes arrow_drop_up
Recommended Articles
Page :