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.
// 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 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. |
# 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# 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 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 ?> |
<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> |
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.
// 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 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. |
# 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# 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 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 ?> |
<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> |
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:
// 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 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 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# 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 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 |
5
Time Complexity: O(logn)
Auxiliary Space: O(1)