# Find two integers A and B such that A ^ N = A + N and B ^ N = B + N

Given a non-negative integer **N**, the task is to find two integers A (greatest integer smaller than N) and (smallest integer greater than N) such that **A + N = A ^ N** and **B + N = B ^ N****Examples:**

Input:N = 5Output:A = 2 and B = 8

2 + 8 = 2 ^ 8 = 10Input:N = 10Output:A = 5 and B = 16

5 + 16 = 5 ^ 16 = 21

**Approach:** Lets find A and B independently. To solve this problem we have to use the property, **x + y = x^y + 2 * (x & y)**

Since the problem states that xor sum is equal to the given sum which implies that their AND must be 0.

**Finding A:**N can be represented as a series of bits of 0 and 1. To find A we will first have to find the most significant bit of N which is set. Since A & N = 0, The places where N has set bit, for that places we will make bits of A as unset and for the places where N has unset bit, we will make that bit set for A as we want to maximize A. This we will do for all the bits from most significant to the least significant. Hence we will get our A.**Finding B:**Finding B is easy. Let i be the position of the leftmost set bit in 1. We want B to be greater than N, also we want B & N =0. Hence using these two facts B will be always (1<< (i+1)).

Below is the implementation of the above approach:

## CPP

`// C++ implementation of the approach` `#include <bits/stdc++.h>` `using` `namespace` `std;` `#define MAX 32` `// Function to find A and B` `void` `findAB(` `int` `N)` `{` ` ` `bitset<MAX> arr(N), brr(N);` ` ` `// To store the leftmost set bit in N` ` ` `int` `leftsetN = -1;` ` ` `for` `(` `int` `i = MAX - 1; i >= 0; --i) {` ` ` `if` `(arr[i] == 1) {` ` ` `leftsetN = i;` ` ` `break` `;` ` ` `}` ` ` `}` ` ` `// To store the value of A` ` ` `int` `A = 0;` ` ` `for` `(` `int` `i = leftsetN; i >= 0; --i) {` ` ` `// If the bit is unset in N` ` ` `// then we will set it in A` ` ` `if` `(arr[i] == 0) {` ` ` `A |= (1 << i);` ` ` `}` ` ` `}` ` ` `// To store the value of B` ` ` `int` `B = 0;` ` ` `// B will be (1 << (leftsetN + 1))` ` ` `B = 1 << (leftsetN + 1);` ` ` `// Print the values of A and B` ` ` `cout << ` `"A = "` `<< A << ` `" and B = "` `<< B;` `}` `// Driver code` `int` `main()` `{` ` ` `int` `N = 5;` ` ` `findAB(N);` ` ` `return` `0;` `}` |

**Output:**

A = 2 and B = 8

Time Complexity: O(MAX)

Auxiliary Space: O(N)