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

/* The obvious approach to find minimum (involves branching) */ 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, 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

#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(); }

## Python3

# 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

## PHP

<?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. ?>

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

#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(); }

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

**Practice Tags :**