给定一个非负数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
方法:以下是步骤:
- 如果n = 0,则返回1。
- 如果设置了n的所有位,则返回n。请参阅这篇文章。
- 否则,不按给定数字执行按位运算(等于1的补码的运算)。使其为num =〜n。
- 获取num的最右边设置位的位置。设位置为pos 。
- 返回(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