Write a program that unsets the rightmost set bit of an integer.
Examples :
Input: 12 (00...01100)
Output: 8 (00...01000)
Input: 7 (00...00111)
Output: 6 (00...00110)
Let the input number be n. n-1 would have all the bits flipped after the rightmost set bit (including the set bit). So, doing n&(n-1) would give us the required result.
So, now let us see how n – 1 is flipping all the bits to the right (including the rightmost set bit also) of the n.
Taking n = 12, so (n – 1) = 11,
n can be written like (n = (n – 1) + 1), so now we can think of this problem as Adding 1 to Any Number (refer this article for better understanding)
Binary representation of (n-1) = 11 = 1011, so now lets make n from (n-1), which can be done by adding a 1 to (n-1)
On adding 1 to any number X, all bits to the right of rightmost 0 (including the rightmost zero) gets flipped
(n-1) = 1011
(n-1) + 1 = 1100 (all the bits to the right of rightmost zero (including rightmost zero) got flipped)
Since we have flipped the rightmost zero, so now, rightmost zero is now flipped to rightmost 1 (aka the rightmost set bit of n) and all bits before rightmost 0 are the same as before
X = 010 . . . . . 0 (rightmost zero) 111
X + 1 = 010 . . . . . 1 (rightmost one) 0 0 0
Example :
X = 71 = Think of it as n – 1
Binary Representation of X = 1000111
X + 1 = 72 = Think of it as n
Binary Representation of (X+1) = 1001000
Observation :
1. All the bits to the left of rightmost 0 (excluding rightmost 0) in X (thinking it as n – 1) are same as in to the left of the rightmost 1(excluding rightmost 1) in X + 1 (thinking of it as n)
2. All the bits to the right of rightmost 0 (including rightmost 0) in X (thinking it as n – 1) are different as in to the right of the rightmost 1 (including rightmost 1) in X + 1 (thinking of it as n)
So bitwise AND of left part of X (till rightmost 0, excluding rightmost 0) and left part of X + 1 (till rightmost 1, excluding rightmost 1) will give the required answer, bitwise AND right part of X (from rightmost 0) and right part of X + 1 (from rightmost 1 (rightmost set bit)) will result in 0
C++
#include <bits/stdc++.h>
using namespace std;
int fun(unsigned int n)
{
return n & (n - 1);
}
int main()
{
int n = 7;
cout<< "The number after unsetting the" ;
cout<< " rightmost set bit " <<fun(n);
return 0;
}
|
C
#include <stdio.h>
int fun(unsigned int n)
{
return n & (n - 1);
}
int main()
{
int n = 7;
printf ( "The number after unsetting the" );
printf ( " rightmost set bit %d" , fun(n));
return 0;
}
|
Java
import java.io.*;
class GFG {
static int fun( int n)
{
return n & (n - 1 );
}
public static void main(String arg[])
{
int n = 7 ;
System.out.print( "The number after unsetting "
+ "the rightmost set bit " + fun(n));
}
}
|
Python3
def fun(n):
return n & (n - 1 )
n = 7
print ( "The number after unsetting the rightmost set bit" , fun(n))
|
C#
using System;
class GFG {
static int fun( int n)
{
return n & (n - 1);
}
public static void Main()
{
int n = 7;
Console.Write( "The number after unsetting "
+ "the rightmost set bit " + fun(n));
}
}
|
Javascript
<script>
function fun(n)
{
return n & (n - 1);
}
let n = 7;
document.write( "The number after unsetting "
+ "the rightmost set bit " + fun(n));
</script>
|
PHP
<?php
function fun( $n )
{
return $n & ( $n - 1);
}
$n = 7;
echo "The number after unsetting the" .
" rightmost set bit " , fun( $n );
?>
|
Output
The number after unsetting the rightmost set bit 6
Time Complexity: O(1)
Auxiliary Space: O(1)
Another Approach:
The rightmost set bit can be switched off by subtracting the LSB from the number.
The LSB of a number can be obtained using (n & (-n)), therefore the number with the rightmost set bit of n switched off is equal to n – (n & (-n));
C++
#include <bits/stdc++.h>
using namespace std;
int fun(unsigned int n)
{
return n - (n & (-n));
}
int main()
{
int n = 7;
cout<< "The number after unsetting the" ;
cout<< " rightmost set bit: " <<fun(n);
return 0;
}
|
Java
import java.io.*;
class GFG
{
static int fun( int n)
{
return n - (n & (-n));
}
public static void main(String[] args)
{
int n = 7 ;
System.out.print( "The number after unsetting the" );
System.out.print( " rightmost set bit: " + fun(n));
}
}
|
Python3
def fun(n):
return n - (n & ( - n))
n = 7
print ( "The number after unsetting the rightmost set bit:" , fun(n))
|
C#
using System;
class GFG {
static int fun( int n) { return n - (n & (-n)); }
public static void Main( string [] args)
{
int n = 7;
Console.Write( "The number after unsetting the" );
Console.Write( " rightmost set bit: " + fun(n));
}
}
|
Javascript
function fun(n)
{
return n - (n & (-n));
}
let n = 7;
console.log( "The number after unsetting the rightmost set bit:" , fun(n));
|
Output
The number after unsetting the rightmost set bit: 6
Time Complexity: O(1)
Auxiliary Space: O(1)
Please write comments if you find the above code/algorithm incorrect, or find better ways to solve the same problem
Feeling lost in the world of random DSA topics, wasting time without progress? It's time for a change! Join our DSA course, where we'll guide you on an exciting journey to master DSA efficiently and on schedule.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 geeks!