📜  下一个更大的整数,具有一个更多的置位位数

📅  最后修改于: 2021-04-24 21:46:30             🧑  作者: Mango

给定一个正整数’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

方法:以下是步骤:

  1. n的二进制表示中找到最右边的未设置位的位置(考虑位置0的最后一位,位置1的第二最后一位,依此类推)。
  2. 让位置用pos表示。
  3. 将位设置在位置pos 。请参阅这篇文章。
  4. 如果二进制表示中没有未设置的位,则对给定的数字执行按位左移1,然后对其加1。

如何获得最右边的未设置位的位置?

  1. 不对给定的数字执行按位运算(等于1的补码运算),让它成为num =〜n。
  2. 获取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