给定一个正整数’n’,在其二进制表示中具有’x’个置位位数。问题是要找到下一个更大的整数(大于n的最小整数),在其二进制表示形式中具有(x + 1)个设置位。
例子 :
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
方法:以下是步骤:
- 在n的二进制表示中找到最右边的未设置位的位置(考虑位置0的最后一位,位置1的第二最后一位,依此类推)。
- 让位置用pos表示。
- 将位设置在位置pos 。请参阅这篇文章。
- 如果二进制表示中没有未设置的位,则对给定的数字执行按位左移1,然后对其加1。
如何获得最右边的未设置位的位置?
- 不对给定的数字执行按位运算(等于1的补码运算),让它成为num =〜n。
- 获取num的最右边设置位的位置。
C++
// C++ implementation to find the next greater integer
// with one more number of set bits
#include
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
// 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
# 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#
// 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
-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
?>
Javascript
输出 :
Next greater integer = 11