Given a positive integer 'n' having 'x' number of set bits in its binary representation. The problem is to find the next greater integer(smallest integer greater than n), having (x+1) number of set bits in its binary representation.
Examples :
Input : 10 Output : 11 (10)10 = (1010)2 is having 2 set bits. (11)10 = (1011)2 is having 3 set bits and is the next greater. Input : 39 Output : 47
Approach: Following are the steps:
- Find the position of the rightmost unset bit(considering last bit at position 0, second last bit at position 1 and so on) in the binary representation of n.
- Let the position be represented by pos.
- Set the bit at position pos. Refer this post.
- If there are no unset bits in the binary representation, then perform bitwise left shift by 1 on the given number and then add 1 to it.
How to get the position of rightmost unset bit?
- Perform bitwise not on the given number(operation equivalent to 1's complement).Let it be num = ~n.
- Get the position of rightmost set bit of num.
// C++ implementation to find the next greater integer
// with one more number of set bits
#include <bits/stdc++.h>
using namespace std;
// function to find the position of rightmost
// set bit. Returns -1 if there are no set bits
int getFirstSetBitPos(int n)
{
return (log2(n&-n)+1) - 1;
}
// function to find the next greater integer
int nextGreaterWithOneMoreSetBit(int n)
{
// position of rightmost unset bit of n
// by passing ~n as argument
int pos = getFirstSetBitPos(~n);
// if n consists of unset bits, then
// set the rightmost unset bit
if (pos > -1)
return (1 << pos) | n;
//n does not consists of unset bits
return ((n << 1) + 1);
}
// Driver program to test above
int main()
{
int n = 10;
cout << "Next greater integer = "
<< nextGreaterWithOneMoreSetBit(n);
return 0;
}
// Java implementation to find the next greater integer
// with one more number of set bits
class GFG {
// function to find the position of rightmost
// set bit. Returns -1 if there are no set bits
static int getFirstSetBitPos(int n)
{
return ((int)(Math.log(n & -n) / Math.log(2)) + 1) - 1;
}
// function to find the next greater integer
static int nextGreaterWithOneMoreSetBit(int n)
{
// position of rightmost unset bit of n
// by passing ~n as argument
int pos = getFirstSetBitPos(~n);
// if n consists of unset bits, then
// set the rightmost unset bit
if (pos > -1)
return (1 << pos) | n;
// n does not consists of unset bits
return ((n << 1) + 1);
}
// Driver code
public static void main(String[] args)
{
int n = 10;
System.out.print("Next greater integer = "
+ nextGreaterWithOneMoreSetBit(n));
}
}
// This code is contributed by Anant Agarwal.
# Python3 implementation to find
# the next greater integer with
# one more number of set bits
import math
# Function to find the position
# of rightmost set bit. Returns -1
# if there are no set bits
def getFirstSetBitPos(n):
return ((int)(math.log(n & -n) /
math.log(2)) + 1) - 1
# Function to find the next greater integer
def nextGreaterWithOneMoreSetBit(n):
# position of rightmost unset bit of
# n by passing ~n as argument
pos = getFirstSetBitPos(~n)
# if n consists of unset bits, then
# set the rightmost unset bit
if (pos > -1):
return (1 << pos) | n
# n does not consists of unset bits
return ((n << 1) + 1)
# Driver code
n = 10
print("Next greater integer = ",
nextGreaterWithOneMoreSetBit(n))
# This code is contributed by Anant Agarwal.
// C# implementation to find the next greater
// integer with one more number of set bits
using System;
class GFG {
// function to find the position of rightmost
// set bit. Returns -1 if there are no set bits
static int getFirstSetBitPos(int n)
{
return ((int)(Math.Log(n & -n) / Math.Log(2))
+ 1) - 1;
}
// function to find the next greater integer
static int nextGreaterWithOneMoreSetBit(int n)
{
// position of rightmost unset bit of n
// by passing ~n as argument
int pos = getFirstSetBitPos(~n);
// if n consists of unset bits, then
// set the rightmost unset bit
if (pos > -1)
return (1 << pos) | n;
// n does not consists of unset bits
return ((n << 1) + 1);
}
// Driver code
public static void Main()
{
int n = 10;
Console.Write("Next greater integer = "
+ nextGreaterWithOneMoreSetBit(n));
}
}
// This code is contributed by Anant Agarwal.
<?php
// PHP implementation to find the
// next greater integer with
// one more number of set bits
// function to find the position
// of rightmost set bit. Returns
// -1 if there are no set bits
function getFirstSetBitPos($n)
{
return (log($n & -$n + 1)) - 1;
}
// function to find the
// next greater integer
function nextGreaterWithOneMoreSetBit($n)
{
// position of rightmost unset bit of n
// by passing ~n as argument
$pos = getFirstSetBitPos(~$n);
// if n consists of unset bits, then
// set the rightmost unset bit
if ($pos > -1)
return (1 << $pos) | $n;
//n does not consists of unset bits
return (($n << 1) + 1);
}
// Driver Code
$n = 10;
echo "Next greater integer = ",
nextGreaterWithOneMoreSetBit($n);
// This code is contributed by Ajit
?>
<script>
// Javascript implementation to find the next greater integer
// with one more number of set bits
// function to find the position of rightmost
// set bit. Returns -1 if there are no set bits
function getFirstSetBitPos(n)
{
return (parseInt(Math.log(n&-n)/Math.log(2))+1) - 1;
}
// function to find the next greater integer
function nextGreaterWithOneMoreSetBit(n)
{
// position of rightmost unset bit of n
// by passing ~n as argument
var pos = getFirstSetBitPos(~n);
// if n consists of unset bits, then
// set the rightmost unset bit
if (pos > -1)
return (1 << pos) | n;
//n does not consists of unset bits
return ((n << 1) + 1);
}
// Driver program to test above
var n = 10;
document.write("Next greater integer = " + nextGreaterWithOneMoreSetBit(n));
</script>
Output :
Next greater integer = 11
Time Complexity: O(log(log N))
Auxiliary Space: O(1)