Unset bits in the given range
Last Updated :
31 May, 2022
Given a non-negative number n and two values l and r. The problem is to unset the bits in the range l to r in the binary representation of n, i.e, to unset bits from the rightmost lth bit to the rightmost rth bit.
Constraint: 1 <= l <= r <= number of bits in the binary representation of n.
Examples:
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
Approach: Following are the steps:
- Calculate num = (1 << (sizeof(int) * 8 – 1)) – 1. This will produce the highest positive integer num. All the bits in num will be set.
- Toggle bits in the range l to r in num. Refer this post.
- Now, perform n = n & num. This will unset the bits in the range l to r in n.
- Return n.
Note: The sizeof(int) has been used as input is of int data type. For large inputs you can use long int or long long int datatypes in place of int.
C++
#include<bits/stdc++.h>
using namespace std;
int toggleBitsFromLToR( int n, int l, int r)
{
int num = ((1 << r) - 1) ^ ((1 << (l - 1)) - 1);
return (n ^ num);
}
int unsetBitsInGivenRange( int n, int l, int r)
{
long num = (1ll << (4 * 8 - 1)) - 1;
num = toggleBitsFromLToR(num, l, r);
return (n & num);
}
int main()
{
int n = 42;
int l = 2, r = 5;
cout<< unsetBitsInGivenRange(n, l, r);
return 0;
}
|
Java
import java.io.*;
class GFG
{
static int toggleBitsFromLToR( int n, int l, int r)
{
int num = (( 1 << r) - 1 ) ^ (( 1 << (l - 1 )) - 1 );
return (n ^ num);
}
static int unsetBitsInGivenRange( int n, int l, int r)
{
int num = ( 1 << ( 4 * 8 - 1 )) - 1 ;
num = toggleBitsFromLToR(num, l, r);
return (n & num);
}
public static void main (String[] args)
{
int n = 42 ;
int l = 2 , r = 5 ;
System.out.println(unsetBitsInGivenRange(n, l, r));
}
}
|
Python3
def toggleBitsFromLToR(n, l, r):
num = ((( 1 << r) - 1 ) ^
(( 1 << (l - 1 )) - 1 ))
return (n ^ num)
def unsetBitsInGivenRange(n, l, r):
num = ( 1 << ( 4 * 8 - 1 )) - 1
num = toggleBitsFromLToR(num, l, r)
return (n & num)
n = 42
l = 2
r = 5
print (unsetBitsInGivenRange(n, l, r))
|
C#
using System;
class GFG {
static int toggleBitsFromLToR( int n, int l, int r)
{
int num = ((1 << r) - 1) ^ ((1 << (l - 1)) - 1);
return (n ^ num);
}
static int unsetBitsInGivenRange( int n, int l, int r)
{
int num = (1 << (2 * 8 - 1)) - 1;
num = toggleBitsFromLToR(num, l, r);
return (n & num);
}
static public void Main() {
int n = 42;
int l = 2, r = 5;
Console.WriteLine(unsetBitsInGivenRange(n, l, r));
}
}
|
PHP
<?php
function toggleBitsFromLToR( $n , $l , $r )
{
$num = ((1 << $r ) - 1) ^
((1 << ( $l - 1)) - 1);
return ( $n ^ $num );
}
function unsetBitsInGivenRange( $n , $l , $r )
{
$num = (1 << (4 * 8 - 1)) - 1;
$num = toggleBitsFromLToR( $num , $l , $r );
return ( $n & $num );
}
$n = 42;
$l = 2;
$r = 5;
echo unsetBitsInGivenRange( $n , $l , $r );
?>
|
Javascript
<script>
function toggleBitsFromLToR(n, l, r)
{
let num = ((1 << r) - 1) ^ ((1 << (l - 1)) - 1);
return (n ^ num);
}
function unsetBitsInGivenRange(n, l, r)
{
let num = (1 << (2 * 8 - 1)) - 1;
num = toggleBitsFromLToR(num, l, r);
return (n & num);
}
let n = 42;
let l = 2, r = 5;
document.write(unsetBitsInGivenRange(n, l, r));
</script>
|
Output:
32
Time Complexity : O(1)
Auxiliary Space: O(1)
Share your thoughts in the comments
Please Login to comment...