Toggle bits in the given range
Given a non-negative number n and two values l and r. The problem is to toggle the bits in the range l to r in the binary representation of n, i.e., to toggle bits from the lth least significant bit bit to the rth least significant bit (the rightmost bit as counted as first bit). A toggle operation flips a bit 0 to 1 and a bit 1 to 0.
Constraint: 1 <= l <= r <= number of bits in the binary representation of n.
Examples:
Input: n = 17, l = 1, r = 3
Output: 23
Explanation: (17)10 = (10001)2
(22)10 = (10110)2
The bits in the range 1 to 3 in the binary representation of 17 are toggled.
Input: n = 50, l = 2, r = 5
Output: 44
Explanation: (50)10 = (110010)2
(44)10 = (101100)2
The bits in the range 2 to 5 in the binary representation of 50 are toggled.
Approach: Following are the steps:
- Calculate num as = ((1 << r) – 1) ^ ((1 << (l-1)) – 1) or as ((1 <<r)-l). This will produce a number num having r number of bits and bits in the range l to r (from rightmost end in binary representation) are the only set bits.
- Now, perform n = n ^ num. This will toggle the bits in the range l to r in n.
C++
#include <bits/stdc++.h>
using namespace std;
unsigned int toggleBitsFromLToR(unsigned int n,
unsigned int l,
unsigned int r)
{
int num = ((1 << r) - 1) ^ ((1 << (l - 1)) - 1);
return (n ^ num);
}
int main()
{
unsigned int n = 17;
unsigned int l = 1, r = 3;
cout << toggleBitsFromLToR(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);
}
public static void main(String[] args)
{
int n = 50 ;
int l = 2 , r = 5 ;
System.out.println(toggleBitsFromLToR(n, l, r));
}
}
|
C#
using System;
namespace Toggle {
public class GFG {
static int toggleBitsFromLToR( int n, int l, int r)
{
int num = ((1 << r) - 1) ^ ((1 << (l - 1)) - 1);
return (n ^ num);
}
public static void Main()
{
int n = 50;
int l = 2, r = 5;
Console.Write(toggleBitsFromLToR(n, l, r));
}
}
}
|
Javascript
<script>
function toggleBitsFromLToR(n, l, r)
{
var num = ((1 << r) - 1) ^ ((1 << (l - 1)) - 1);
return (n ^ num);
}
var n = 50;
var l = 2, r = 5;
document.write( toggleBitsFromLToR(n, l, r));
</script>
|
PHP
<?php
function toggleBitsFromLToR( $n , $l , $r )
{
$num = ((1 << $r ) - 1) ^
((1 << ( $l - 1)) - 1);
return ( $n ^ $num );
}
$n = 50;
$l = 2; $r = 5;
echo toggleBitsFromLToR( $n , $l , $r );
?>
|
Python3
def toggleBitsFromLToR(n, l, r):
num = (( 1 << r) - 1 ) ^ (( 1 << (l - 1 )) - 1 )
return (n ^ num)
n = 50
l = 2
r = 5
print (toggleBitsFromLToR(n, l, r))
|
Time Complexity: O(1)
Auxiliary Space: O(1)
Approach 2:
Iterate over the given range from L to R and check if the ith bit is set or not. if the ith bit is set then make it unset otherwise make it set bit.
C++
#include <bits/stdc++.h>
using namespace std;
int toggleBitsFromLToR( int N, int L, int R)
{
int res = N;
for ( int i = L; i <= R; i++) {
if ((N & (1 << (i - 1))) != 0) {
res = res ^ (1 << (i - 1));
}
else {
res = res | (1 << (i - 1));
}
}
return res;
}
int main()
{
int n = 50;
int l = 2, r = 5;
cout << toggleBitsFromLToR(n, l, r);
return 0;
}
|
Java
import java.io.*;
class GFG {
static int toggleBitsFromLToR( int N, int L, int R)
{
int res = N;
for ( int i = L; i <= R; i++) {
if ((N & ( 1 << (i - 1 ))) != 0 ) {
res = res ^ ( 1 << (i - 1 ));
}
else {
res = res | ( 1 << (i - 1 ));
}
}
return res;
}
public static void main(String[] args)
{
int n = 50 ;
int l = 2 , r = 5 ;
System.out.println(toggleBitsFromLToR(n, l, r));
}
}
|
C#
using System;
class GFG {
static int toggleBitsFromLToR( int N, int L, int R)
{
int res = N;
for ( int i = L; i <= R; i++) {
if ((N & (1 << (i - 1))) != 0) {
res = res ^ (1 << (i - 1));
}
else {
res = res | (1 << (i - 1));
}
}
return res;
}
public static void Main( string [] args)
{
int n = 50;
int l = 2, r = 5;
Console.WriteLine(toggleBitsFromLToR(n, l, r));
}
}
|
Javascript
function toggleBitsFromLToR(N, L, R)
{
let res = N;
for (let i = L; i <= R; i++) {
if ((N & (1 << (i - 1))) != 0) {
res = res ^ (1 << (i - 1));
}
else {
res = res | (1 << (i - 1));
}
}
return res;
}
let n = 50;
let l = 2, r = 5;
console.log(toggleBitsFromLToR(n, l, r));
|
Python3
def toggleBitsFromLToR(N, L, R):
res = N
for i in range (L, R + 1 ):
if ((N & ( 1 << (i - 1 ))) ! = 0 ):
res = res ^ ( 1 << (i - 1 ))
else :
res = res | ( 1 << (i - 1 ))
return res
n = 50
l = 2
r = 5
print (toggleBitsFromLToR(n, l, r))
|
Time Complexity: O(R – L + 1)
Auxiliary Space: O(1)
Last Updated :
04 Mar, 2024
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...