Open In App

Toggle bits in the given range

Improve
Improve
Like Article
Like
Save
Share
Report

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.

Recommended Practice

Approach: Following are the steps:

  1. 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.
  2. Now, perform n = n ^ num. This will toggle the bits in the range l to r in n.

C++




// C++ implementation to toggle bits in
// the given range
#include <bits/stdc++.h>
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 bits in the range l to r in 'n'
    // and return the number
    // Besides this, we can calculate num as: num=(1<<r)-l .
    return (n ^ num);
}
 
// Driver program to test above
int main()
{
    unsigned int n = 17;
    unsigned int l = 1, r = 3;
    cout << toggleBitsFromLToR(n, l, r);
    return 0;
}


Java




// Java implementation to toggle 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 bits in the range l to r in 'n'
        // and return the number
        // Besides this, we can calculate num as:
        // num=(1<<r)-l .
        return (n ^ num);
    }
 
    // driver program
    public static void main(String[] args)
    {
        int n = 50;
        int l = 2, r = 5;
        System.out.println(toggleBitsFromLToR(n, l, r));
    }
}
 
// Contributed by Pramod Kumar


C#




// C# implementation to toggle bits
// in the given range
using System;
 
namespace Toggle {
public 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 bits in the range l to r in 'n'
        // Besides this, we can calculate num as:
        // num=(1<<r)-l .
        // and return the number
        return (n ^ num);
    }
 
    // Driver Code
    public static void Main()
    {
        int n = 50;
        int l = 2, r = 5;
        Console.Write(toggleBitsFromLToR(n, l, r));
    }
}
}
 
// This code is contributed by Sam007.


Javascript




<script>
 
// Javascript implementation to toggle bits in
// the given range
 
// function to toggle bits in the given range
function 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
    var num = ((1 << r) - 1) ^ ((1 << (l - 1)) - 1);
 
    // toggle bits in the range l to r in 'n'
    // and return the number
//Besides this, we can calculate num as: num=(1<<r)-l .
    return (n ^ num);
}
 
// Driver program to test above
var n = 50;
var l = 2, r = 5;
document.write( toggleBitsFromLToR(n, l, r));
 
</script>


PHP




<?php
// PHP implementation
// to toggle bits in
// the given range
 
// function to toggle bits
// in the given range
function 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 bits in the
    // range l to r in 'n'
    //Besides this, we can calculate num as: $num=(1<<$r)-$l .
    // and return the number
 
    return ($n ^ $num);
}
 
    // Driver Code
    $n = 50;
    $l = 2; $r = 5;
    echo toggleBitsFromLToR($n, $l, $r);
 
// This code is contributed by anuj_67
?>


Python3




# Python implementation
# to toggle 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 bits in the
    # range l to r in 'n'
    # Besides this, we can calculate num as: num=(1<<r)-l .
 
    # and return the number
    return (n ^ num)
 
# Driver code
 
 
n = 50
l = 2
r = 5
 
print(toggleBitsFromLToR(n, l, r))
 
# This code is contributed
# by Anant Agarwal.


Output

44



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++




// C++ implementation to toggle bits in
// the given range
#include <bits/stdc++.h>
 
using namespace std;
 
// Function to toggle bits in the given range
int toggleBitsFromLToR(int N, int L, int R)
{
    int res = N;
    for (int i = L; i <= R; i++) {
 
        // Set bit
        if ((N & (1 << (i - 1))) != 0) {
 
            // XOR will set 0 to already set
            // bits(a^a=0)
            res = res ^ (1 << (i - 1));
        }
 
        // unset bits
        else {
            // OR will set'0'bits to 1
            res = res | (1 << (i - 1));
        }
    }
    return res;
}
 
// Driver code
int main()
{
    int n = 50;
    int l = 2, r = 5;
    cout << toggleBitsFromLToR(n, l, r);
 
    return 0;
}
 
// This code is contributed by phasing17


Java




// Java implementation to toggle 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)
    {
        int res = N;
        for (int i = L; i <= R; i++) {
 
            // Set bit
            if ((N & (1 << (i - 1))) != 0) {
 
                // XOR will set 0 to already set
                // bits(a^a=0)
                res = res ^ (1 << (i - 1));
            }
 
            // unset bits
            else {
                // OR will set'0'bits to 1
                res = res | (1 << (i - 1));
            }
        }
        return res;
    }
 
    // Driver method
    public static void main(String[] args)
    {
        int n = 50;
        int l = 2, r = 5;
        System.out.println(toggleBitsFromLToR(n, l, r));
    }
}
 
// Contributed by Ocean Bhardwaj


C#




// C# implementation to toggle 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)
  {
    int res = N;
    for (int i = L; i <= R; i++) {
 
      // Set bit
      if ((N & (1 << (i - 1))) != 0) {
 
        // XOR will set 0 to already set
        // bits(a^a=0)
        res = res ^ (1 << (i - 1));
      }
 
      // unset bits
      else {
        // OR will set'0'bits to 1
        res = res | (1 << (i - 1));
      }
    }
    return res;
  }
 
  // Driver Code
  public static void Main(string[] args)
  {
    int n = 50;
    int l = 2, r = 5;
 
    // Function call
    Console.WriteLine(toggleBitsFromLToR(n, l, r));
  }
}
 
// This code is Contributed by phasing17


Javascript




// JavaScript implementation to toggle bits in
// the given range
 
// Function to toggle bits in the given range
function toggleBitsFromLToR(N, L, R)
{
    let res = N;
    for (let i = L; i <= R; i++) {
 
        // Set bit
        if ((N & (1 << (i - 1))) != 0) {
 
            // XOR will set 0 to already set
            // bits(a^a=0)
            res = res ^ (1 << (i - 1));
        }
 
        // unset bits
        else {
            // OR will set'0'bits to 1
            res = res | (1 << (i - 1));
        }
    }
    return res;
}
 
 
// Driver code
let n = 50;
let l = 2, r = 5;
console.log(toggleBitsFromLToR(n, l, r));
 
 
 
// This code is contributed by phasing17


Python3




# Python3 implementation to toggle bits in
# the given range
 
# Function to toggle bits in the given range
def toggleBitsFromLToR(N, L, R):
 
    res = N
    for i in range(L, R + 1):
 
        # Set bit
        if ((N & (1 << (i - 1))) != 0):
 
            # XOR will set 0 to already set
            # bits(a^a=0)
            res = res ^ (1 << (i - 1))
 
        # unset bits
        else:
            # OR will set'0'bits to 1
            res = res | (1 << (i - 1))
 
    return res
 
# Driver code
n = 50
l = 2
r = 5
print(toggleBitsFromLToR(n, l, r))
 
# This code is contributed by phasing17


Output

44



Time Complexity: O(R – L + 1) 
Auxiliary Space: O(1)


 



Last Updated : 04 Mar, 2024
Like Article
Save Article
Previous
Next
Share your thoughts in the comments
Similar Reads