Convert given integer X to the form 2^N – 1
Given an integer x. The task is to convert x to the form 2n – 1 by performing the following operations in the specified order on x:
- You can select any non-negative integer n and update x = x xor (2n – 1)
- Replace x with x + 1.
The first applied operation must be of a first type, the second of the second type, the third again of the first type, and so on. Formally, if we number the operations from one in the order they are executed, then odd-numbered operations must be of the first type and the even-numbered operations must be of the second type. The task is to find the number of operations required to convert x to the form 2n – 1.
Examples:
Input: x = 39
Output: 4
Operation 1: Pick n = 5, x is transformed into (39 xor 31) = 56.
Operation 2: x = 56 + 1 = 57
Operation 3: Pick n = 3, x is transformed into (57 xor 7) = 62.
Operation 4: x = 62 + 1 = 63 i.e. (26 – 1).
So, total number of operations are 4.
Input: x = 7
Output: 0
As 23 -1 = 7.
So, no operation is required.
Approach: Take the smallest number larger than x which is of the form of 2n – 1 say num, then update x = x xor num and then x = x + 1 performing two operations. Repeat the step until x is of the form 2n – 1. Print the number of operations performed in the end.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
const int MAX = 24;
int countOp( int x)
{
int arr[MAX];
arr[0] = 1;
for ( int i = 1; i < MAX; i++)
arr[i] = arr[i - 1] * 2;
int temp = x;
bool flag = true ;
int ans;
int operations = 0;
bool flag2 = false ;
for ( int i = 0; i < MAX; i++) {
if (arr[i] - 1 == x)
flag2 = true ;
if (arr[i] > x) {
ans = i;
break ;
}
}
if (flag2)
return 0;
while (flag) {
if (arr[ans] < x)
ans++;
operations++;
for ( int i = 0; i < MAX; i++) {
int take = x ^ (arr[i] - 1);
if (take <= arr[ans] - 1) {
if (take > temp)
temp = take;
}
}
if (temp == arr[ans] - 1) {
flag = false ;
break ;
}
temp++;
operations++;
x = temp;
if (x == arr[ans] - 1)
flag = false ;
}
return operations;
}
int main()
{
int x = 39;
cout << countOp(x);
return 0;
}
|
Java
import java.io.*;
class GFG
{
static int MAX = 24 ;
static int countOp( int x)
{
int arr[] = new int [MAX];
arr[ 0 ] = 1 ;
for ( int i = 1 ; i < MAX; i++)
arr[i] = arr[i - 1 ] * 2 ;
int temp = x;
boolean flag = true ;
int ans = 0 ;
int operations = 0 ;
boolean flag2 = false ;
for ( int i = 0 ; i < MAX; i++)
{
if (arr[i] - 1 == x)
flag2 = true ;
if (arr[i] > x)
{
ans = i;
break ;
}
}
if (flag2)
return 0 ;
while (flag)
{
if (arr[ans] < x)
ans++;
operations++;
for ( int i = 0 ; i < MAX; i++)
{
int take = x ^ (arr[i] - 1 );
if (take <= arr[ans] - 1 )
{
if (take > temp)
temp = take;
}
}
if (temp == arr[ans] - 1 )
{
flag = false ;
break ;
}
temp++;
operations++;
x = temp;
if (x == arr[ans] - 1 )
flag = false ;
}
return operations;
}
public static void main (String[] args)
{
int x = 39 ;
System.out.println(countOp(x));
}
}
|
Python3
MAX = 24 ;
def countOp(x) :
arr = [ 0 ] * MAX ;
arr[ 0 ] = 1 ;
for i in range ( 1 , MAX ) :
arr[i] = arr[i - 1 ] * 2 ;
temp = x;
flag = True ;
ans = 0 ;
operations = 0 ;
flag2 = False ;
for i in range ( MAX ) :
if (arr[i] - 1 = = x) :
flag2 = True ;
if (arr[i] > x) :
ans = i;
break ;
if (flag2) :
return 0 ;
while (flag) :
if (arr[ans] < x) :
ans + = 1 ;
operations + = 1 ;
for i in range ( MAX ) :
take = x ^ (arr[i] - 1 );
if (take < = arr[ans] - 1 ) :
if (take > temp) :
temp = take;
if (temp = = arr[ans] - 1 ) :
flag = False ;
break ;
temp + = 1 ;
operations + = 1 ;
x = temp;
if (x = = arr[ans] - 1 ) :
flag = False ;
return operations;
if __name__ = = "__main__" :
x = 39 ;
print (countOp(x));
|
C#
using System;
class GFG
{
static int MAX = 24;
static int countOp( int x)
{
int []arr = new int [MAX];
arr[0] = 1;
for ( int i = 1; i < MAX; i++)
arr[i] = arr[i - 1] * 2;
int temp = x;
bool flag = true ;
int ans = 0;
int operations = 0;
bool flag2 = false ;
for ( int i = 0; i < MAX; i++)
{
if (arr[i] - 1 == x)
flag2 = true ;
if (arr[i] > x)
{
ans = i;
break ;
}
}
if (flag2)
return 0;
while (flag)
{
if (arr[ans] < x)
ans++;
operations++;
for ( int i = 0; i < MAX; i++)
{
int take = x ^ (arr[i] - 1);
if (take <= arr[ans] - 1)
{
if (take > temp)
temp = take;
}
}
if (temp == arr[ans] - 1)
{
flag = false ;
break ;
}
temp++;
operations++;
x = temp;
if (x == arr[ans] - 1)
flag = false ;
}
return operations;
}
static public void Main ()
{
int x = 39;
Console.WriteLine(countOp(x));
}
}
|
Javascript
<script>
const MAX = 24;
function countOp(x)
{
let arr = new Array(MAX);
arr[0] = 1;
for (let i = 1; i < MAX; i++)
arr[i] = arr[i - 1] * 2;
let temp = x;
let flag = true ;
let ans;
let operations = 0;
let flag2 = false ;
for (let i = 0; i < MAX; i++) {
if (arr[i] - 1 == x)
flag2 = true ;
if (arr[i] > x) {
ans = i;
break ;
}
}
if (flag2)
return 0;
while (flag) {
if (arr[ans] < x)
ans++;
operations++;
for (let i = 0; i < MAX; i++) {
let take = x ^ (arr[i] - 1);
if (take <= arr[ans] - 1) {
if (take > temp)
temp = take;
}
}
if (temp == arr[ans] - 1) {
flag = false ;
break ;
}
temp++;
operations++;
x = temp;
if (x == arr[ans] - 1)
flag = false ;
}
return operations;
}
let x = 39;
document.write(countOp(x));
</script>
|
Time Complexity: O(MAX*N)
Auxiliary Space: O(MAX)
Last Updated :
31 May, 2022
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...