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 x*3.5 by adding 2* x, x and x/2. To calculate 2*x, 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