给定一个非负数n和两个值l和r 。问题是要取消设置n的二进制表示形式中范围在l到r之间的位,即要取消设置从最右边的第l位到最右边的第r位的位。
约束: 1 <= l <= r <= n的二进制表示形式的位数。
例子:
Input : n = 42, l = 2, r = 5
Output : 32
(42)10 = (101010)2
(32)10 = (100000)2
The bits in the range 2 to 5 in the binary
representation of 42 have been unset.
Input : n = 63, l = 1, r = 4
Output : 48
方法:以下是步骤:
- 计算num =(1 <<((sizeof(int)* 8 – 1))–1。这将产生最高的正整数num 。 num中的所有位都将被设置。
- 在num中切换范围从l到r的位。请参阅这篇文章。
- 现在,执行n = n&num 。这将取消设置n中从l到r的范围中的位。
- 返回n 。
注意: sizeof(int)已用作int数据类型的输入。对于大型输入,可以使用long int或long long int数据类型代替int 。
C/C++
// C++ implementation to unset bits in the given range
#include
using namespace std;
// function to toggle bits in the given range
unsigned int toggleBitsFromLToR(unsigned int n,
unsigned int l,
unsigned int r)
{
// calculating a number 'num' having 'r' number of bits
// and bits in the range l to r are the only set bits
int num = ((1 << r) - 1) ^ ((1 << (l - 1)) - 1);
// toggle the bits in the range l to r in 'n'
// and return the number
return (n ^ num);
}
// function to unset bits in the given range
unsigned int unsetBitsInGivenRange(unsigned int n,
unsigned int l, unsigned int r)
{
// 'num' is the highest positive integer number
// all the bits of 'num' are set
unsigned int num = (1 << (sizeof(int) * 8 - 1)) - 1;
// toggle the bits in the range l to r in 'num'
num = toggleBitsFromLToR(num, l, r);
// unset the bits in the range l to r in 'n'
// and return the number
return (n & num);
}
// Driver program to test above
int main()
{
unsigned int n = 42;
unsigned int l = 2, r = 5;
cout << unsetBitsInGivenRange(n, l, r);
return 0;
}
Java
// Java implementation to unset bits in the given range
import java.io.*;
class GFG
{
// Function to toggle bits in the given range
static int toggleBitsFromLToR(int n, int l, int r)
{
// calculating a number 'num' having 'r' number of bits
// and bits in the range l to r are the only set bits
int num = ((1 << r) - 1) ^ ((1 << (l - 1)) - 1);
// toggle the bits in the range l to r in 'n'
// and return the number
return (n ^ num);
}
// Function to unset bits in the given range
static int unsetBitsInGivenRange(int n, int l, int r)
{
// 'num' is the highest positive integer number
// all the bits of 'num' are set
int num = (1 << (4 * 8 - 1)) - 1;
// toggle the bits in the range l to r in 'num'
num = toggleBitsFromLToR(num, l, r);
// unset the bits in the range l to r in 'n'
// and return the number
return (n & num);
}
// driver program
public static void main (String[] args)
{
int n = 42;
int l = 2, r = 5;
System.out.println(unsetBitsInGivenRange(n, l, r));
}
}
// Contributed by Pramod Kumar
Python3
# python implementation to unset bits
# in the given range
# Function to toggle bits in the
# given range
def toggleBitsFromLToR(n, l, r):
# calculating a number 'num'
# having 'r' number of bits
# and bits in the range l to
# r are the only set bits
num = (((1 << r) - 1) ^
((1 << (l - 1)) - 1))
# toggle the bits in the range
# l to r in 'n' and return the
# number
return (n ^ num)
# Function to unset bits in the
# given range
def unsetBitsInGivenRange(n, l, r):
# 'num' is the highest positive
# integer number all the bits
# of 'num' are set
num = (1 << (4 * 8 - 1)) - 1
# toggle the bits in the range
# l to r in 'num'
num = toggleBitsFromLToR(num, l, r)
# unset the bits in the range
# l to r in 'n' and return the
# number
return (n & num)
# Driver code
n = 42
l = 2
r = 5
print(unsetBitsInGivenRange(n, l, r))
# This code is contributed by Sam007.
C#
// C# implementation to unset
// bits in the given range
using System;
class GFG {
// Function to toggle bits in the given range
static int toggleBitsFromLToR(int n, int l, int r)
{
// calculating a number 'num'
// having 'r' number of bits
// and bits in the range l
// to r are the only set bits
int num = ((1 << r) - 1) ^ ((1 << (l - 1)) - 1);
// toggle the bits in the
// range l to r in 'n'
// and return the number
return (n ^ num);
}
// Function to unset bits in the given range
static int unsetBitsInGivenRange(int n, int l, int r)
{
// 'num' is the highest
// positive integer number
// all the bits of 'num'
// are set
int num = (1 << (2 * 8 - 1)) - 1;
// toggle the bits in
// the range l to r in 'num'
num = toggleBitsFromLToR(num, l, r);
// unset the bits in
// the range l to r in 'n'
// and return the number
return (n & num);
}
// Driver Code
static public void Main() {
int n = 42;
int l = 2, r = 5;
Console.WriteLine(unsetBitsInGivenRange(n, l, r));
}
}
// This Code is Contributed by akt_mit
PHP
输出:
32