Open In App
Related Articles

Toggle all bits after most significant bit

Improve Article
Improve
Save Article
Save
Like Article
Like

Given a number, toggle all bits of it after most significant bit including most significant bit.

Examples : 

Input : 10 
Output : 5
Binary representation of 10 is 1010
After toggling we get 0101

Input : 5
Output : 2

We can toggle a bit by doing XOR of it with 1 (Note that 1 ^ 0 = 1 and 1 ^ 1 = 0). The idea is to take a number temp with only one bit set. One by one move the only set bit of temp to left and do XOR of it with n until it crosses MSB (Most Significant Bit) of n.  

C++




// CPP program to toggle set  bits starting
// from MSB
#include<bits/stdc++.h>
using namespace std;
 
void toggle(int &n)
{
    // temporary variable to
    // use XOR with one of a n
    int temp = 1;
 
    // Run loop until the only
    // set bit in temp crosses
    // MST of n.
    while (temp <= n)
    {
        // Toggle bit of n
        // corresponding to
        // current set bit in
        // temp.
        n = n ^ temp;
 
        // Move set bit to next
        // higher position.
        temp = temp << 1;
    }
}
 
// Driver code
int main()
{
    int n = 10;
    toggle(n);
    cout << n;
    return 0;
}

Java




// Java program to toggle set
// bits starting from MSB
 
class GFG {
     
static int toggle(int n) {
     
    // temporary variable to
    // use XOR with one of a n
    int temp = 1;
 
    // Run loop until the only
    // set bit in temp crosses
    // MST of n.
    while (temp <= n) {
         
    // Toggle bit of n
    // corresponding to
    // current set bit in
    // temp.
    n = n ^ temp;
 
    // Move set bit to next
    // higher position.
    temp = temp << 1;
    }
    return n;
}
 
// Driver code
public static void main(String arg[])
{
    int n = 10;
    n = toggle(n);
    System.out.print(n);
}
}
 
// This code is contributed by Anant Agarwal.

Python3




# Python program to toggle
# set  bits starting
# from MSB
 
def toggle(n):
 
    # temporary variable to
    # use XOR with one of a n
    temp = 1
  
    #Run loop until the only
    #set bit in temp crosses
    #MST of n.
    while (temp <= n):
     
        # Toggle bit of n
        # corresponding to
        # current set bit in
        # temp.
        n = n ^ temp
  
        # Move set bit to next
        # higher position.
        temp = temp << 1
 
    return n
  
# Driver code
 
n = 10
n=toggle(n)
print(n)
 
# This code is contributed
# by Anant Agarwal.

C#




// C# program to toggle set
// bits starting from MSB
using System;
 
class GFG {
 
// Function to toggle bits
// starting from MSB   
static int toggle(int n) {
     
    // temporary variable to
    // use XOR with one of a n
    int temp = 1;
 
    // Run loop until the only
    // set bit in temp crosses
    // MST of n.
    while (temp <= n) {
         
    // Toggle bit of n
    // corresponding to
    // current set bit in
    // temp.
    n = n ^ temp;
 
    // Move set bit to next
    // higher position.
    temp = temp << 1;
    }
    return n;
}
 
// Driver code
public static void Main()
{
    int n = 10;
    n = toggle(n);
    Console.Write(n);
}
}
 
// This code is contributed by Nitin Mittal.

PHP




<?php
// PHP program to toggle set
// bits starting from MSB
 
function toggle( &$n)
{
    // temporary variable to
    // use XOR with one of a n
    $temp = 1;
 
    // Run loop until the only
    // set bit in temp crosses
    // MST of n.
    while ($temp <= $n)
    {
        // Toggle bit of n
        // corresponding to
        // current set bit in
        // temp.
        $n = $n ^ $temp;
 
        // Move set bit to next
        // higher position.
        $temp = $temp << 1;
    }
}
 
// Driver code
$n = 10;
toggle($n);
echo $n;
 
// This code is contributed by ajit
?>

Javascript




<script>
 
// Javascript program to toggle set
// bits starting from MSB
function toggle(n)
{
     
    // Temporary variable to
    // use XOR with one of a n
    let temp = 1;
 
    // Run loop until the only
    // set bit in temp crosses
    // MST of n.
    while (temp <= n)
    {
         
        // Toggle bit of n
        // corresponding to
        // current set bit in
        // temp.
        n = n ^ temp;
 
        // Move set bit to next
        // higher position.
        temp = temp << 1;
    }
    return n;
}
 
// Driver code
let n = 10;
n = toggle(n);
 
document.write(n);
 
// This code is contributed by subham348
 
</script>

Output

5

Time Complexity: O(log n)

Auxiliary Space: O(1)

The above solution can be optimized to work in O(1) time under the assumption that numbers are stored in 32 bits. 

C++




// CPP program to toggle set  bits starting
// from MSB
#include<bits/stdc++.h>
using namespace std;
 
// Returns a number which has all set bits
// starting from MSB of n
int setAllBitsAfterMSB(int n)
{   
    // This makes sure two bits
    // (From MSB and including MSB)
    // are set
    n |= n>>1;
 
    // This makes sure 4 bits
    // (From MSB and including MSB)
    // are set
    n |= n>>2;  
 
    n |= n>>4; 
    n |= n>>8;
    n |= n>>16;
    return n;
}
 
void toggle(int &n)
{
    n = n ^ setAllBitsAfterMSB(n);
}
 
// Driver code
int main()
{
    int n = 10;
    toggle(n);
    cout << n;
    return 0;
}

Java




// Java program to toggle set bits
// starting from MSB
 
class GFG {
     
// Returns a number which has all
// set bits starting from MSB of n
static int setAllBitsAfterMSB(int n) {
     
    // This makes sure two bits
    // (From MSB and including MSB)
    // are set
    n |= n >> 1;
 
    // This makes sure 4 bits
    // (From MSB and including MSB)
    // are set
    n |= n >> 2;
 
    n |= n >> 4;
    n |= n >> 8;
    n |= n >> 16;
    return n;
}
static int toggle(int n)
{
    n = n ^ setAllBitsAfterMSB(n);
    return n;
}
 
// Driver code
public static void main(String arg[])
{
    int n = 10;
    n = toggle(n);
    System.out.print(n);
}
}
 
// This code is contributed by Anant Agarwal.

Python3




# Python program to toggle set  bits starting
# from MSB
 
# Returns a number which has all set bits
# starting from MSB of n
def setAllBitsAfterMSB(n):
  
    # This makes sure two bits
    # (From MSB and including MSB)
    # are set
    n |= n>>1
  
    # This makes sure 4 bits
    # (From MSB and including MSB)
    # are set
    n |= n>>2  
  
    n |= n>>4 
    n |= n>>8
    n |= n>>16
    return n
 
def toggle(n):
 
    n = n ^ setAllBitsAfterMSB(n)
    return n
     
#Driver code
 
n = 10
n=toggle(n)
print(n)
# This code is contributed by Anant Agarwal.

C#




// C# program to toggle set bits
// starting from MSB
using System;
 
class GFG {
         
    // Returns a number which has all
    // set bits starting from MSB of n
    static int setAllBitsAfterMSB(int n)
    {
         
        // This makes sure two bits
        // (From MSB and including MSB)
        // are set
        n |= n >> 1;
     
        // This makes sure 4 bits
        // (From MSB and including MSB)
        // are set
        n |= n >> 2;
     
        n |= n >> 4;
        n |= n >> 8;
        n |= n >> 16;
        return n;
    }
     
    static int toggle(int n)
    {
        n = n ^ setAllBitsAfterMSB(n);
        return n;
    }
     
    // Driver code
    public static void Main()
    {
        int n = 10;
        n = toggle(n);
        Console.WriteLine(n);
    }
}
 
// This code is contributed by Sam007.

PHP




<?php
// PHP program to toggle set
// bits starting from MSB
 
// Returns a number which
// has all set bits starting
// from MSB of n
function setAllBitsAfterMSB($n)
{
    // This makes sure two bits
    // (From MSB and including MSB)
    // are set
    $n |= $n >> 1;
 
    // This makes sure 4 bits
    // (From MSB and including MSB)
    // are set
    $n |= $n >> 2;
 
    $n |= $n >> 4;
    $n |= $n >> 8;
    $n |= $n >> 16;
    return $n;
}
function toggle(&$n)
{
    $n = $n ^ setAllBitsAfterMSB($n);
}
 
// Driver Code
$n = 10;
toggle($n);
echo $n;
 
// This code is contributed by ajit
?>

Javascript




<script>
 
// Javascript program to toggle set  bits starting
// from MSB
 
// Returns a number which has all set bits
// starting from MSB of n
function setAllBitsAfterMSB(n)
{   
    // This makes sure two bits
    // (From MSB and including MSB)
    // are set
    n |= n>>1;
 
    // This makes sure 4 bits
    // (From MSB and including MSB)
    // are set
    n |= n>>2;  
 
    n |= n>>4; 
    n |= n>>8;
    n |= n>>16;
    return n;
}
 
function toggle(n)
{
    n = n ^ setAllBitsAfterMSB(n);
    return n;
}
 
// Driver code
    let n = 10;
    document.write(toggle(n));
 
</script>

Output

5

Time Complexity: O(1)

Auxiliary Space: O(1)

Thanks to Devanshu Agarwal for suggesting this approach.

Another Approach:

To toggle a specific bit, we can take XOR of that bit with 1.

Therefore, for an n – bit number, we can construct a binary mask of the form 1111….11111, ie, all n bits are set. This is nothing but 2n – 1.

The implementation is shown below:

C++




// CPP program to toggle set  bits starting
// from MSB
#include<bits/stdc++.h>
using namespace std;
 
// Returns a number which has all set bits
// starting from MSB of n
int toggle(int num)
{  
    //the number of bits is equal to log2num + 1
    int n = (int)log2(num) + 1;
    //calculating mask
    int mask = pow(2, n) - 1;
    //toggling bits using xor with mask
    return num ^ mask;
}
 
 
// Driver code
int main()
{
    int num = 10;
    cout << toggle(num);
}
 
//this code is contributed by phasing17

Java




// Java program to toggle set  bits starting
// from MSB
import java.util.*;
 
class GFG {
 
  // Returns a number which has all set bits
  // starting from MSB of n
  static int toggle(int num)
  {
    // the number of bits is equal to log2num + 1
    int n = (int)(Math.log(num) / Math.log(2)) + 1;
 
    // calculating mask
    int mask = (int)Math.pow(2, n) - 1;
 
    // toggling bits using xor with mask
    return num ^ mask;
  }
 
  // Driver code
  public static void main(String[] args)
  {
    int num = 10;
    System.out.println(toggle(num));
  }
}
 
// this code is contributed by phasing17

Python3




# Python3 program to toggle set
# bits starting from MSB
from math import log
 
# Returns a number which has all set bits
# starting from MSB of n
def toggle(num):
 
    # the number of bits is equal to log2num + 1
    n = int(log(num, 2)) + 1
 
    # calculating mask
    mask = pow(2, n) - 1
 
    # toggling bits using xor with mask
    return num ^ mask
 
# Driver code
num = 10
print(toggle(num))
 
# This code is contributed by phasing17

C#




// C# program to toggle set  bits starting
// from MSB
using System;
 
class GFG {
 
  // Returns a number which has all set bits
  // starting from MSB of n
  static int toggle(int num)
  {
     
    // the number of bits is equal to log2num + 1
    int n = (int)(Math.Log(num) / Math.Log(2)) + 1;
 
    // calculating mask
    int mask = (int)Math.Pow(2, n) - 1;
 
    // toggling bits using xor with mask
    return num ^ mask;
  }
 
  // Driver code
  public static void Main(string[] args)
  {
    int num = 10;
    Console.WriteLine(toggle(num));
  }
}
 
// This code is contributed by phasing17

Javascript




// JavaScript program to toggle set
// bits starting from MSB
 
// Returns a number which has all set bits
// starting from MSB of n
function toggle(num)
{  
    // the number of bits is equal to log2num + 1
    let n = Math.floor((Math.log(num) / Math.log(2)) + 1);
     
    // calculating mask
    let mask = Math.pow(2, n) - 1;
     
    // toggling bits using xor with mask
    return num ^ mask;
}
 
// Driver code
let num = 10;
console.log(toggle(num));
 
// this code is contributed by phasing17

Output

5

Time Complexity: O(logn)

Auxiliary Space: O(1)

This article is contributed by Devanshu Agarwal. If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.
Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.
 


Last Updated : 14 Jul, 2022
Like Article
Save Article
Similar Reads
Related Tutorials