Open In App
Related Articles

Toggle all bits after most significant bit

Improve
Improve
Improve
Like Article
Like
Save Article
Save
Report issue
Report

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)



 



Last Updated : 14 Jul, 2022
Like Article
Save Article
Previous
Next
Share your thoughts in the comments
Similar Reads