# Maximum XOR value of a pair from a range

Given a range [L, R], we need to find two integers in this range such that their XOR is maximum among all possible choices of two integers. More Formally,
given [L, R], find max (A ^ B) where L <= A, B
Examples :

```Input  : L = 8
R = 20
Output : 31
31 is XOR of 15 and 16.

Input  : L = 1
R = 3
Output : 3
```

## Recommended: Please try your approach on {IDE} first, before moving on to the solution.

A simple solution is to generate all pairs, find their XOR values and finally return the maximum XOR value.

An efficient solution is to consider pattern of binary values from L to R. We can see that first bit from L to R either changes from 0 to 1 or it stays 1 i.e. if we take the XOR of any two numbers for maximum value their first bit will be fixed which will be same as first bit of XOR of L and R itself.
After observing the technique to get first bit, we can see that if we XOR L and R, the most significant bit of this XOR will tell us the maximum value we can achieve i.e. let XOR of L and R is 1xxx where x can be 0 or 1 then maximum XOR value we can get is 1111 because from L to R we have all possible combination of xxx and it is always possible to choose these bits in such a way from two numbers such that their XOR becomes all 1. It is explained below with some examples,

```Examples 1:
L = 8    R = 20
L ^ R = (01000) ^ (10100) = (11100)
Now as L ^ R is of form (1xxxx) we
can get maximum XOR as (11111) by
choosing A and B as 15 and 16 (01111
and 10000)

Examples 2:
L = 16     R = 20
L ^ R = (10000) ^ (10100) = (00100)
Now as L ^ R is of form (1xx) we can
get maximum xor as (111) by choosing
A and B as 19 and 20 (10011 and 10100)
```

So the solution of this problem depends on the value of (L ^ R) only. We will calculate the L^R value first and then from most significant bit of this value, we will add all 1s to get the final result.

## C++

 `// C/C++ program to get maximum xor value ` `// of two numbers in a range ` `#include ` `using` `namespace` `std; ` ` `  `// method to get maximum xor value in range [L, R] ` `int` `maxXORInRange(``int` `L, ``int` `R) ` `{ ` `    ``// get xor of limits ` `    ``int` `LXR = L ^ R; ` ` `  `    ``//  loop to get msb position of L^R ` `    ``int` `msbPos = 0; ` `    ``while` `(LXR) ` `    ``{ ` `        ``msbPos++; ` `        ``LXR >>= 1; ` `    ``} ` ` `  `    ``// construct result by adding 1, ` `    ``// msbPos times ` `    ``int` `maxXOR = 0; ` `    ``int` `two = 1; ` `    ``while` `(msbPos--) ` `    ``{ ` `        ``maxXOR += two; ` `        ``two <<= 1; ` `    ``} ` ` `  `    ``return` `maxXOR; ` `} ` ` `  `//  Driver code to test above methods ` `int` `main() ` `{ ` `    ``int` `L = 8; ` `    ``int` `R = 20; ` `    ``cout << maxXORInRange(L, R) << endl; ` `    ``return` `0; ` `} `

## Java

 `// Java program to get maximum xor value ` `// of two numbers in a range ` ` `  `class` `Xor ` `{ ` `    ``// method to get maximum xor value in range [L, R] ` `    ``static` `int` `maxXORInRange(``int` `L, ``int` `R) ` `    ``{ ` `        ``// get xor of limits ` `        ``int` `LXR = L ^ R; ` `      `  `        ``//  loop to get msb position of L^R ` `        ``int` `msbPos = ``0``; ` `        ``while` `(LXR > ``0``) ` `        ``{ ` `            ``msbPos++; ` `            ``LXR >>= ``1``; ` `        ``} ` `      `  `        ``// construct result by adding 1, ` `        ``// msbPos times ` `        ``int` `maxXOR = ``0``; ` `        ``int` `two = ``1``; ` `        ``while` `(msbPos-- >``0``) ` `        ``{ ` `            ``maxXOR += two; ` `            ``two <<= ``1``; ` `        ``} ` `      `  `        ``return` `maxXOR; ` `    ``} ` `     `  `    ``// main function  ` `    ``public` `static` `void` `main (String[] args)  ` `    ``{ ` `        ``int` `L = ``8``; ` `        ``int` `R = ``20``; ` `        ``System.out.println(maxXORInRange(L, R)); ` `    ``} ` `} `

## Python3

 `# Python3 program to get maximum xor  ` `# value of two numbers in a range ` ` `  `# Method to get maximum xor ` `# value in range [L, R] ` `def` `maxXORInRange(L, R): ` ` `  `    ``# get xor of limits ` `    ``LXR ``=` `L ^ R ` ` `  `    ``# loop to get msb position of L^R ` `    ``msbPos ``=` `0` `    ``while``(LXR): ` `     `  `        ``msbPos ``+``=` `1` `        ``LXR >>``=` `1` `     `  ` `  `    ``# construct result by adding 1, ` `    ``# msbPos times ` `    ``maxXOR, two ``=` `0``, ``1` `     `  `    ``while` `(msbPos): ` `     `  `        ``maxXOR ``+``=` `two ` `        ``two <<``=` `1` `        ``msbPos ``-``=` `1` ` `  `    ``return` `maxXOR ` ` `  `# Driver code ` `L, R ``=` `8``, ``20` `print``(maxXORInRange(L, R)) ` ` `  `# This code is contributed by Anant Agarwal. `

## C#

 `// C# program to get maximum xor  ` `// value of two numbers in a range ` `using` `System; ` ` `  `class` `Xor ` `{ ` `     `  `    ``// method to get maximum xor  ` `    ``// value in range [L, R] ` `    ``static` `int` `maxXORInRange(``int` `L, ``int` `R) ` `    ``{ ` `         `  `        ``// get xor of limits ` `        ``int` `LXR = L ^ R; ` `       `  `        ``// loop to get msb position of L^R ` `        ``int` `msbPos = 0; ` `        ``while` `(LXR > 0) ` `        ``{ ` `            ``msbPos++; ` `            ``LXR >>= 1; ` `        ``} ` `       `  `        ``// construct result by ` `        ``// adding 1, msbPos times ` `        ``int` `maxXOR = 0; ` `        ``int` `two = 1; ` `        ``while` `(msbPos-- >0) ` `        ``{ ` `            ``maxXOR += two; ` `            ``two <<= 1; ` `        ``} ` `       `  `        ``return` `maxXOR; ` `    ``} ` `      `  `    ``// Driver code  ` `    ``public` `static` `void` `Main()  ` `    ``{ ` `        ``int` `L = 8; ` `        ``int` `R = 20; ` `        ``Console.WriteLine(maxXORInRange(L, R)); ` `    ``} ` `} ` ` `  `// This code is contributed by Anant Agarwal. `

## PHP

 `>= 1; ` `    ``} ` ` `  `    ``// construct result by  ` `    ``// adding 1, msbPos times ` `    ``\$maxXOR` `= 0; ` `    ``\$two` `= 1; ` `    ``while` `(``\$msbPos``--) ` `    ``{ ` `        ``\$maxXOR` `+= ``\$two``; ` `        ``\$two` `<<= 1; ` `    ``} ` ` `  `    ``return` `\$maxXOR``; ` `} ` ` `  `// Driver Code ` `\$L` `= 8; ` `\$R` `= 20; ` `echo` `maxXORInRange(``\$L``, ``\$R``), ``"\n"``; ` ` `  `// This code is contributed by aj_36 ` `?> `

Output :

```31
```

This article is contributed by Utkarsh Trivedi. If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

My Personal Notes arrow_drop_up

Improved By : jit_t, shaurya uppal

Article Tags :
Practice Tags :

4

Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.