Related Articles
Find closest integer with the same weight
• Difficulty Level : Basic
• Last Updated : 03 Dec, 2019

Given a positive integer X the task is to find an integer Y such that:

1. The count of set bits is Y is equal to the count of set bits in X.
2. X != Y.
3. |X – Y| is minimum.

Examples:

Input: X = 92
Output: 90
90 is the closest number to 92 having
equal number of set bits.

Input: X = 17
Output: 18

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

Approach: A little math can lead us to the solution approach. Since the number of bits in both the numbers has to be the same, if a set bit is flipped then an unset bit will also have to be flipped.
Now the problem reduces to choosing two bits for the flipping. Suppose one bit at index i is flipped and another bit at index j (j < i) from the LSB (least significant bit). Then the absolute value of the difference between the original integer and the new one is 2i – 2j. To minimize this, i has to be as small as possible and j has to be as close to i as possible.
Since the number of set bits have to be equal, so the bit at index i must be different from the bit at index j. This means that the smallest can be the rightmost bit that's different from the LSB, and j must be the very next bit. In summary, the correct approach is to swap the two rightmost consecutive bits that are different.

Below is the implementation of the above approach:

## C++

 // C++ implementation of the approach#include using namespace std;  const int NumUnsignBits = 64;  // Function to return the number// closest to x which has equal// number of set bits as xunsigned long findNum(unsigned long x){    // Loop for each bit in x and    // compare with the next bit    for (int i = 0; i < NumUnsignBits - 1; i++) {        if (((x >> i) & 1) != ((x >> (i + 1)) & 1)) {            x ^= (1 << i) | (1 << (i + 1));            return x;        }    }}  // Driver codeint main(){    int n = 92;      cout << findNum(n);      return 0;}

## Java

 // Java implementation of the approachclass GFG {static int NumUnsignBits = 64;  // Function to return the number// closest to x which has equal// number of set bits as xstatic long findNum(long x){    // Loop for each bit in x and    // compare with the next bit    for (int i = 0; i < NumUnsignBits - 1; i++)    {        if (((x >> i) & 1) != ((x >> (i + 1)) & 1))        {            x ^= (1 << i) | (1 << (i + 1));            return x;        }    }    return Long.MIN_VALUE;}  // Driver codepublic static void main(String[] args){    int n = 92;      System.out.println(findNum(n));}}  // This code is contributed by PrinciRaj1992

## Python3

 # Python3 implementation of the approach NumUnsignBits = 64;   # Function to return the number # closest to x which has equal # number of set bits as x def findNum(x) :       # Loop for each bit in x and     # compare with the next bit     for i in range(NumUnsignBits - 1) :        if (((x >> i) & 1) != ((x >> (i + 1)) & 1)) :            x ^= (1 << i) | (1 << (i + 1));             return x;  # Driver code if __name__ == "__main__" :     n = 92;     print(findNum(n));   # This code is contributed by AnkitRai01

## C#

 // C# implementation of the approachusing System;      class GFG {static int NumUnsignBits = 64;  // Function to return the number// closest to x which has equal// number of set bits as xstatic long findNum(long x){    // Loop for each bit in x and    // compare with the next bit    for (int i = 0; i < NumUnsignBits - 1; i++)    {        if (((x >> i) & 1) != ((x >> (i + 1)) & 1))        {            x ^= (1 << i) | (1 << (i + 1));            return x;        }    }    return long.MinValue;}  // Driver codepublic static void Main(String[] args){    int n = 92;      Console.WriteLine(findNum(n));}}  // This code is contributed by Rajput-Ji
Output:
90

Time Complexity: O(logn)

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.  Get hold of all the important mathematical concepts for competitive programming with the Essential Maths for CP Course at a student-friendly price.

In case you wish to attend live classes with industry experts, please refer Geeks Classes Live and Geeks Classes Live USA

My Personal Notes arrow_drop_up