Toggle bits in the given range
Last Updated : 01 Apr, 2024
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: 22
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++ // 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.
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
Time Complexity: O(R - L + 1)
Auxiliary Space: O(1)
Similar Reads
Unset bits in the given range 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.Ex
8 min read
Set bits in N equals to M in the given range. You are given two 32-bit numbers, N and M, and two bit positions, i and j. Write a method to set all bits between i and j in N equal to M (e.g., M becomes a substring of N located at i and starting at j).Examples : Input : N = 1, M = 2, i = 2, j = 4Output: 9N = 00000001(Considering 8 bits only)M = 1
7 min read
Set all the bits in given range of a number Given a non-negative number n and two values l and r. The problem is to set 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 r-th bit. Constraint: 1 <= l <= r <= number of bits in the binary representation of n.Ex
5 min read
Count set bits in a range Given a non-negative number n and two values l and r. The problem is to count the number of set bits in the range l to r in the binary representation of n, i.e, to count set bits from the rightmost lth bit to the rightmost rth bit. Constraint: 1 <= l <= r <= number of bits in the binary rep
6 min read
Toggle the last m bits Given a non-negative number n. The problem is to toggle the last m bits in the binary representation of n. A toggle operation flips a bit from 0 to 1 and a bit from 1 to 0.Constraint: 1 <= m <= n. Examples: Input : n = 21, m = 2 Output : 22 (21)10 = (10101)2 (22)10 = (10110)2 The last two bits
4 min read