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). We can get x3.5 by adding 2 x, x and x/2. To calculate 2x, left shift x by 1 and to calculate x/2, right shift x by 2. The function should not use any of the arithmetic operators (+, ++, –, -, … etc). Sum of two bits can be obtained by performing XOR (^) of the two bits. Carry bit can be obtained by performing AND (&) of two bits. We can extend this logic for integers. If x and y don’t have set bits at same position(s), then bitwise XOR (^) of x and y gives the sum of x and y. To incorporate common set bits also, bitwise AND (&) is used. Bitwise AND of x and y gives all carry bits. We calculate (x & y) << 1 and add it to x ^ y to get the required result. The idea is to use subtractor logic. Write a program to subtract one from a given number. The idea is to use bitwise operators. Like addition, Write a function Add() that returns sum of two integers. The function should not use any of the arithmetic operators (+, ++, –, -, … etc). Sum of two bits can be obtained by performing XOR (^) of the two bits. Carry bit can be obtained by performing AND (&) of two bits. We can extend this logic for integers. If x and y don’t have set bits at same position(s), then bitwise XOR (^) of x and y gives the sum of x and y. To incorporate common set bits also, bitwise AND (&) is used. Bitwise AND of x and y gives all carry bits. We calculate (x & y) << 1 and add it to x ^ y to get the required result. The idea is to use subtractor logic. The use of operators like ‘+’, ‘-‘, ‘ ’, ‘/’, ‘++’, ‘–‘ …etc. are not allowed. So, doing n&(n-1) would give us the required result.
- Implementation
using
System;
class
GFG {
/* unsets the rightmost set bit
of n and returns the result */
static
int
fun(
int
n)
{
return
n & (n - 1);
}
// Driver code
public
static
void
Main()
{
int
n = 7;
Console.Write(
"The number after unsetting "
+
"the rightmost set bit "
+ fun(n));
}
}
Output :
The number after unsetting the rightmost set bit 6