On some rare machines where branching is expensive, the below obvious approach to find minimum can be slow as it uses branching.
C++
int min( int x, int y)
{
return (x < y) ? x : y
}
|
Java
static int min( int x, int y)
{
return (x < y) ? x : y;
}
|
Python3
def min (x, y):
return x if x < y else y
|
C#
static int min( int x, int y)
{
return (x < y) ? x : y;
}
|
Javascript
<script>
function min(x, y)
{
return (x < y) ? x : y;
}
</script>
|
C
int min( int x, int y)
{
return (x < y) ? x : y
}
|
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));
C++
#include<iostream>
using namespace std;
class gfg
{
public :
int min( int x, int y)
{
return y ^ ((x ^ y) & -(x < y));
}
int max( int x, int y)
{
return x ^ ((x ^ y) & -(x < y));
}
};
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 ();
}
|
Java
public class AWS {
static int min( int x, int y)
{
return y ^ ((x ^ y) & -(x << y));
}
static int max( int x, int y)
{
return x ^ ((x ^ y) & -(x << y));
}
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));
}
}
|
Python3
def min (x, y):
return y ^ ((x ^ y) & - (x < y))
def max (x, y):
return x ^ ((x ^ y) & - (x < y))
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))
|
C#
using System;
public class AWS
{
public static int min( int x, int y)
{
return y ^ ((x ^ y) & -(x << y));
}
public static int max( int x, int y)
{
return x ^ ((x ^ y) & -(x << y));
}
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));
}
}
|
Javascript
<script>
function min(x,y)
{
return y ^ ((x ^ y) & -(x << y));
}
function max(x,y)
{
return x ^ ((x ^ y) & -(x << y));
}
let x = 15
let y = 6
document.write( "Minimum of " + x + " and " + y + " is " );
document.write(min(x, y) + "<br>" );
document.write( "Maximum of " + x + " and " + y + " is " );
document.write(max(x, y) + "\n" );
</script>
|
C
#include<stdio.h>
int min( int x, int y)
{
return y ^ ((x ^ y) & -(x < y));
}
int max( int x, int y)
{
return x ^ ((x ^ y) & -(x < y));
}
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 ();
}
|
PHP
<?php
function m_in( $x , $y )
{
return $y ^ (( $x ^ $y ) &
- ( $x < $y ));
}
function m_ax( $x , $y )
{
return $x ^ (( $x ^ $y ) &
- ( $x < $y ));
}
$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 );
?>
|
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)))
C++
#include <bits/stdc++.h>
using namespace std;
#define CHARBIT 8
int min( int x, int y)
{
return y + ((x - y) & ((x - y) >>
( sizeof ( int ) * CHARBIT - 1)));
}
int max( int x, int y)
{
return x - ((x - y) & ((x - y) >>
( sizeof ( int ) * CHARBIT - 1)));
}
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);
}
|
Java
class GFG
{
static int CHAR_BIT = 4 ;
static int INT_BIT = 8 ;
static int min( int x, int y)
{
return y + ((x - y) & ((x - y) >>
(INT_BIT * CHAR_BIT - 1 )));
}
static int max( int x, int y)
{
return x - ((x - y) & ((x - y) >>
(INT_BIT * CHAR_BIT - 1 )));
}
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));
}
}
|
Python3
import sys;
CHAR_BIT = 8 ;
INT_BIT = sys.getsizeof( int ());
def Min (x, y):
return y + ((x - y) & ((x - y) >>
(INT_BIT * CHAR_BIT - 1 )));
def Max (x, y):
return x - ((x - y) & ((x - y) >>
(INT_BIT * CHAR_BIT - 1 )));
x = 15 ;
y = 6 ;
print ( "Minimum of" , x, "and" ,
y, "is" , Min (x, y));
print ( "Maximum of" , x, "and" ,
y, "is" , Max (x, y));
|
C#
using System;
class GFG
{
static int CHAR_BIT = 8;
static int min( int x, int y)
{
return y + ((x - y) & ((x - y) >>
( sizeof ( int ) * CHAR_BIT - 1)));
}
static int max( int x, int y)
{
return x - ((x - y) & ((x - y) >>
( sizeof ( int ) * CHAR_BIT - 1)));
}
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));
}
}
|
Javascript
<script>
var CHAR_BIT = 4;
var INT_BIT = 8;
function min(x , y) {
return y + ((x - y) & ((x - y) >> (INT_BIT * CHAR_BIT - 1)));
}
function max(x , y) {
return x - ((x - y) & ((x - y) >> (INT_BIT * CHAR_BIT - 1)));
}
var x = 15;
var y = 6;
document.write( "Minimum of " + x + " and " + y + " is " + min(x, y)+ "<br/>" );
document.write( "Maximum of " + x + " and " + y + " is " + max(x, y));
</script>
|
C
#include<stdio.h>
#define CHAR_BIT 8
int min( int x, int y)
{
return y + ((x - y) & ((x - y) >>
( sizeof ( int ) * CHAR_BIT - 1)));
}
int max( int x, int y)
{
return x - ((x - y) & ((x - y) >>
( sizeof ( int ) * CHAR_BIT - 1)));
}
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 ();
}
|
Output
Minimum of 15 and 6 is 6
Maximum of15 and 6 is 15
Time Complexity: O(1)
Auxiliary Space: O(1)