Maximize the number by rearranging bits
Given an unsigned number, find the maximum number that could be formed by using the bits of the given unsigned number.
Examples :
Input : 1 (0000....0001)
Output : 2147483648 (1000....0000)
Input : 7 (0000....0111)
Output : 3758096384 (0111....0000)
Method 1 (Simple)
1. Find binary representation of the number using simple decimal to binary representation technique.
2. Count number of set bits in the binary representation equal to ‘n’.
3. Create a binary representation with its ‘n’ most significant bits set to 1.
4. Convert the binary representation back to the number.
C++
#include <bits/stdc++.h>
#define ll unsigned int
using namespace std;
ll maximize(ll a)
{
ll n = _popcnt32(a);
ll res = 0;
for ( int i=1; i<=n; i++)
res |= (1 << (32 - i));
return res;
}
int main()
{
ll a = 1;
cout << maximize(a) << endl;
return 0;
}
|
Java
import java.io.*;
class GFG
{
private static int _popcnt32( long number)
{
int counter = 0 ;
while (number > 0 )
{
if (number % 2 == 1 )
{
counter++;
}
number = number / 2 ;
}
return counter;
}
static long maximize( long a)
{
int n = _popcnt32(a);
long res = 0 ;
for ( int i = 1 ; i <= n; i++)
res = ( int )res | ( 1 << ( 32 - i));
return Math.abs(res);
}
public static void main(String args[])
{
long a = 1 ;
System.out.print(maximize(a));
}
}
|
Python3
def _popcnt32(number) :
counter = 0
while (number > 0 ) :
if (number % 2 = = 1 ) :
counter = counter + 1
number = int (number / 2 )
return counter
def maximize(a) :
n = _popcnt32(a)
res = 0
for i in range ( 1 , n + 1 ) :
res = int (res |
( 1 << ( 32 - i)))
return abs (res)
a = 1
print (maximize(a))
|
C#
using System;
class GFG
{
static long maximize( long a)
{
string binaryString = Convert.ToString(a, 2);
int n = binaryString.Split( new [] { '0' },
StringSplitOptions.RemoveEmptyEntries).Length;
long res = 0;
for ( int i = 1; i <= n; i++)
res = ( int )res | (1 << (32 - i));
return Math.Abs(res);
}
static void Main()
{
long a = 1;
Console.WriteLine(maximize(a));
}
}
|
PHP
<?php
function _popcnt32( $number )
{
$counter = 0;
while ( $number > 0)
{
if ( $number % 2 == 1)
{
$counter ++;
}
$number = intval ( $number / 2);
}
return $counter ;
}
function maximize( $a )
{
$n = _popcnt32( $a );
$res = 0;
for ( $i = 1; $i <= $n ; $i ++)
$res = intval ( $res |
(1 << (32 - $i )));
return abs ( $res );
}
$a = 1;
echo (maximize( $a ));
?>
|
Javascript
<script>
function _popcnt32(number)
{
var counter = 0;
while (number > 0)
{
if (number % 2 == 1)
{
counter++;
}
number = parseInt(number / 2);
}
return counter;
}
function maximize(a)
{
var n = _popcnt32(a);
var res = 0;
for ( var i=1; i<=n; i++)
res |= (1 << (32 - i));
return Math.abs(res);
}
var a = 1;
document.write(maximize(a));
</script>
|
Method 2 (Efficient)
The idea is to first find a number with n least significant set bits, then shift the number left by 32-n.
C++
#include <bits/stdc++.h>
#define ll unsigned int
using namespace std;
ll maximize(ll a)
{
ll n = _popcnt32(a);
if (n == 32)
return a;
ll res = (1 << n) - 1;
return (res << (32 - n)) ;
}
int main()
{
ll a = 3;
cout << maximize(a) << endl;
return 0;
}
|
Java
import java.io.*;
class GFG
{
static long _popcnt32( long n)
{
long count = 0 ;
while (n != 0 )
{
n = n & (n - 1 );
count++;
}
return count;
}
static long maximize( long a)
{
long n = _popcnt32(a);
if (n == 32 )
return a;
long res = ( 1 << n) - 1 ;
return (res << ( 32 - n)) ;
}
public static void main(String args[])
{
long a = 3 ;
System.out.print(maximize(a));
}
}
|
Python3
def _popcnt32(n):
count = 0
while (n ! = 0 ):
n = n & (n - 1 )
count = count + 1
return count
def maximize(a):
n = _popcnt32(a)
if (n = = 32 ):
return a
res = ( 1 << n) - 1
return (res << ( 32 - n))
if __name__ = = '__main__' :
a = 3
print (maximize(a))
|
C#
using System;
class GFG
{
static long _popcnt32( long n)
{
long count = 0;
while (n != 0)
{
n = n & (n - 1);
count++;
}
return count;
}
static long maximize( long a)
{
long n = _popcnt32(a);
if (n == 32)
return a;
long res = (1 << Convert.ToInt32(n)) - 1;
return (res << (32 - Convert.ToInt32(n))) ;
}
static void Main()
{
long a = 3;
Console.WriteLine(maximize(a));
}
}
|
PHP
<?php
function _popcnt32( $n )
{
$count = 0;
while ( $n != 0)
{
$n = $n & ( $n - 1);
$count ++;
}
return $count ;
}
function maximize( $a )
{
$n = _popcnt32( $a );
if ( $n == 32)
return $a ;
$res = (1 << $n ) - 1;
return ( $res << (32 - $n )) ;
}
$a = 3;
echo (maximize( $a ));
?>
|
Javascript
function _popcnt32(n)
{
var count = 0n;
while (n != 0n)
{
n = n & (n - 1n);
count = count + 1n;
}
return count;
}
function maximize(a)
{
var n = _popcnt32(a);
if (n == 32n)
return a;
var res = (1n << n) - 1n;
return (res << (32n - n));
}
var a = 3n;
console.log(Number(maximize(a)));
|
Note: The above codes use GCC specific functions. If we wish to write code for other compilers, we may use Count set bits in an integer.
Last Updated :
13 Jun, 2022
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...