📜  设置最右边的未设置位

📅  最后修改于: 2021-05-25 06:08:13             🧑  作者: Mango

给定一个非负数n 。问题在于设置n的二进制表示形式中最右边的未设置位。如果没有未设置的位,则仅保留数字不变。

例子:

Input : 21
Output : 23
(21)10 = (10101)2
Rightmost unset bit is at position 2(from right) as 
highlighted in the binary representation of 21.
(23)10 = (10111)2
The bit at position 2 has been set.

Input : 15
Output : 15

方法:以下是步骤:

  1. 如果n = 0,则返回1。
  2. 如果设置了n的所有位,则返回n。请参阅这篇文章。
  3. 否则,不按给定数字执行按位运算(等于1的补码的运算)。使其为num =〜n。
  4. 获取num的最右边设置位的位置。设位置为pos
  5. 返回(1 <<(pos – 1))| n
C++
// C++ implementation to set the rightmost unset bit
#include 
using namespace std;
 
// function to find the position
// of rightmost set bit
int getPosOfRightmostSetBit(int n)
{
    return log2(n&-n)+1;
}
 
int setRightmostUnsetBit(int n)
{
    // if n = 0, return 1
    if (n == 0)
        return 1;
     
    // if all bits of 'n' are set
    if ((n & (n + 1)) == 0)   
        return n;
     
    // position of rightmost unset bit in 'n'
    // passing ~n as argument
    int pos = getPosOfRightmostSetBit(~n);   
     
    // set the bit at position 'pos'
    return ((1 << (pos - 1)) | n);
}
 
// Driver program to test above
int main()
{
    int n = 21;
    cout << setRightmostUnsetBit(n);
    return 0;
}


Java
// Java implementation to set
// the rightmost unset bit
 
class GFG {
     
// function to find the position
// of rightmost set bit
static int getPosOfRightmostSetBit(int n)
{
    return (int)((Math.log10(n & -n)) / (Math.log10(2))) + 1;
}
 
static int setRightmostUnsetBit(int n)
{
    // if n = 0, return 1
    if (n == 0)
    return 1;
 
    // if all bits of 'n' are set
    if ((n & (n + 1)) == 0)
    return n;
 
    // position of rightmost unset bit in 'n'
    // passing ~n as argument
    int pos = getPosOfRightmostSetBit(~n);
 
    // set the bit at position 'pos'
    return ((1 << (pos - 1)) | n);
}
 
// Driver code
public static void main(String arg[]) {
    int n = 21;
    System.out.print(setRightmostUnsetBit(n));
}
}
 
// This code is contributed by Anant Agarwal.


Python3
# Python3 implementation to
# set the rightmost unset bit
import math
 
# function to find the position
# of rightmost set bit
def getPosOfRightmostSetBit(n):
 
    return int(math.log2(n&-n)+1)
 
  
def setRightmostUnsetBit(n):
 
    # if n = 0, return 1
    if (n == 0):
        return 1
      
    # if all bits of 'n' are set
    if ((n & (n + 1)) == 0):   
        return n
      
    # position of rightmost unset bit in 'n'
    # passing ~n as argument
    pos = getPosOfRightmostSetBit(~n)   
      
    # set the bit at position 'pos'
    return ((1 << (pos - 1)) | n)
 
# Driver code
 
n = 21
print(setRightmostUnsetBit(n))
 
# This code is contributed
# by Anant Agarwal.


C#
// C# implementation to set
// the rightmost unset bit
using System;
 
class GFG{
     
// Function to find the position
// of rightmost set bit
static int getPosOfRightmostSetBit(int n)
{
    return (int)((Math.Log10(n & -n)) /
                 (Math.Log10(2))) + 1;
}
 
static int setRightmostUnsetBit(int n)
{
     
    // If n = 0, return 1
    if (n == 0)
        return 1;
 
    // If all bits of 'n' are set
    if ((n & (n + 1)) == 0)
        return n;
 
    // Position of rightmost unset bit in 'n'
    // passing ~n as argument
    int pos = getPosOfRightmostSetBit(~n);
 
    // Set the bit at position 'pos'
    return ((1 << (pos - 1)) | n);
}
 
// Driver code
public static void Main(String []arg)
{
    int n = 21;
     
    Console.Write(setRightmostUnsetBit(n));
}
}
 
// This code is contributed by shivanisinghss2110


Java
import java.io.*;
import java.util.Scanner;
 
public class SetMostRightUnsetBit {
    public static void main(String args[])
    {
        int a = 21;
        setMostRightUnset(a);
    }
 
    private static void setMostRightUnset(int a)
    {
        // will get a number with all set bits except the
        // first set bit
        int x = a ^ (a - 1);
        System.out.println(Integer.toBinaryString(x));
 
        // We reduce it to the number with single 1's on
        // the position of first set bit in given number
        x = x & a;
        System.out.println(Integer.toBinaryString(x));
 
        // Move x on right by one shift to make OR
        // operation and make first rightest unset bit 1
        x = x >> 1;
 
        int b = a | x;
 
        System.out.println("before setiing bit " +
                               Integer.toBinaryString(a));
        System.out.println("after setting bit " +
                               Integer.toBinaryString(b));
    }
}


Python3
def setMostRightUnset(a):
     
    # Will get a number with all set
    # bits except the first set bit
    x = a ^ (a - 1)
    print(bin(x)[2:])
 
    # We reduce it to the number with
    # single 1's on the position of
    # first set bit in given number
    x = x & a
    print(bin(x)[2:])
 
    # Move x on right by one shift to
    # make OR operation and make first
    # rightest unset bit 1
    x = x >> 1
 
    b = a | x
 
    print("before setiing bit ", bin(a)[2:])
    print("after setting bit ", bin(b)[2:])
     
# Driver Code
if __name__ == '__main__':
     
    a = 21
     
    setMostRightUnset(a)
 
# This code is contributed by mohit kumar 29


C#
using System;
 
class SetMostRightUnsetBit{
     
// Driver Code
public static void Main(String []args)
{
    int a = 21;
    setMostRightUnset(a);
}
 
private static void setMostRightUnset(int a)
{
     
    // will get a number with all set bits
    // except the first set bit
    int x = a ^ (a - 1);
    Console.WriteLine(Convert.ToString(x));
 
    // We reduce it to the number with single 1's on
    // the position of first set bit in given number
    x = x & a;
    Console.WriteLine(Convert.ToString(x));
 
    // Move x on right by one shift to make OR
    // operation and make first rightest unset bit 1
    x = x >> 1;
 
    int b = a | x;
 
    Console.WriteLine("before setiing bit " +
    Convert.ToString(a, 2));
    Console.WriteLine("after setting bit " +
    Convert.ToString(b, 2));
}
}
 
// This code is contributed by shivanisinghss2110


输出:

23

替代实施
这个想法是使用Integer.toBinaryString()

Java

import java.io.*;
import java.util.Scanner;
 
public class SetMostRightUnsetBit {
    public static void main(String args[])
    {
        int a = 21;
        setMostRightUnset(a);
    }
 
    private static void setMostRightUnset(int a)
    {
        // will get a number with all set bits except the
        // first set bit
        int x = a ^ (a - 1);
        System.out.println(Integer.toBinaryString(x));
 
        // We reduce it to the number with single 1's on
        // the position of first set bit in given number
        x = x & a;
        System.out.println(Integer.toBinaryString(x));
 
        // Move x on right by one shift to make OR
        // operation and make first rightest unset bit 1
        x = x >> 1;
 
        int b = a | x;
 
        System.out.println("before setiing bit " +
                               Integer.toBinaryString(a));
        System.out.println("after setting bit " +
                               Integer.toBinaryString(b));
    }
}

Python3

def setMostRightUnset(a):
     
    # Will get a number with all set
    # bits except the first set bit
    x = a ^ (a - 1)
    print(bin(x)[2:])
 
    # We reduce it to the number with
    # single 1's on the position of
    # first set bit in given number
    x = x & a
    print(bin(x)[2:])
 
    # Move x on right by one shift to
    # make OR operation and make first
    # rightest unset bit 1
    x = x >> 1
 
    b = a | x
 
    print("before setiing bit ", bin(a)[2:])
    print("after setting bit ", bin(b)[2:])
     
# Driver Code
if __name__ == '__main__':
     
    a = 21
     
    setMostRightUnset(a)
 
# This code is contributed by mohit kumar 29

C#

using System;
 
class SetMostRightUnsetBit{
     
// Driver Code
public static void Main(String []args)
{
    int a = 21;
    setMostRightUnset(a);
}
 
private static void setMostRightUnset(int a)
{
     
    // will get a number with all set bits
    // except the first set bit
    int x = a ^ (a - 1);
    Console.WriteLine(Convert.ToString(x));
 
    // We reduce it to the number with single 1's on
    // the position of first set bit in given number
    x = x & a;
    Console.WriteLine(Convert.ToString(x));
 
    // Move x on right by one shift to make OR
    // operation and make first rightest unset bit 1
    x = x >> 1;
 
    int b = a | x;
 
    Console.WriteLine("before setiing bit " +
    Convert.ToString(a, 2));
    Console.WriteLine("after setting bit " +
    Convert.ToString(b, 2));
}
}
 
// This code is contributed by shivanisinghss2110

输出:

1
1
before setiing bit 10101
after setting bit 10101