Skip to content
Related Articles
Get the best out of our app
GFG App
Open App
geeksforgeeks
Browser
Continue

Related Articles

Generate an Array such with elements maximized through swapping bits

Improve Article
Save Article
Like Article
Improve Article
Save Article
Like Article

Given an array arr[], the task is to generate a modified array such that all its elements are maximized by swapping of bits.
Examples: 
 

Input: arr[] = {10, 15} 
Output: 12, 15 
Explanation: 
Binary representation of (10)10 = (1010)2. Swap the second and third bit to get the binary representation as (1100)2 = (12)10
For 15, its binary representation is 1111, which can not be further changed to get greater value. 
Input: arr[] = {8, 15, 9, 10, 14} 
Output: 8, 15, 12, 12, 14 
 

 

Approach: 
Follow the steps below to solve the problem: 
 

  • Count the number of set and unset bits in every array element.
  • Shift all the set bits to the left(MSB) and all the unset bits to the right(LSB) to maximize the array elements.
  • If count of set bits or unset bits is equal to the number of bits of the array element, then that element cannot be altered( e.g. (7)10 = (111)2
  • Print the maximized elements in the array

Below is the implementation of the above approach:
 

C++




// C++ implementation to
// find maximum sequence by
// swapping bits
#include <bits/stdc++.h>
using namespace std;
 
// Function to generate the maximized
// array elements
void maximizedArray(
    int arr[], int N)
{
    int num, i = 0;
 
    // Traverse the array
    while (N--) {
        num = arr[i];
        int one = 0;
        int zero = 0;
 
        // Iterate to count set and
        // unset bits
        while (num) {
 
            // Count of unset bits
            if (num % 2 == 0) {
                zero++;
            }
            else {
 
                // Count of set bits
                one++;
            }
 
            // Bitwise right shift
            num = num >> 1;
        }
 
        for (int j = zero; j < (one + zero);
             j++) {
 
            // Shifting all 1's to MSB
            // and 0's to LSB
            num += (1 << j);
        }
        cout << num;
        i++;
 
        if (N > 0)
            cout << ", ";
    }
}
 
// Driver Code
int main()
{
 
    int arr[] = { 8, 15, 9, 10, 14 };
    int N = sizeof(arr) / sizeof(arr[0]);
 
    maximizedArray(
        arr, N);
 
    return 0;
}


Java




// Java implementation to find
// maximum sequence by swapping bits
class GFG{
 
// Function to generate the maximized
// array elements
public static void maximizedArray(int arr[],
                                  int N)
{
    int num, i = 0;
 
    // Traverse the array
    for(int l = N; l > 0; l--)
    {
       num = arr[i];
       int one = 0;
       int zero = 0;
        
       // Iterate to count set and
       // unset bits
       while (num != 0)
       {
            
           // Count of unset bits
           if (num % 2 == 0)
           {
               zero++;
           }
           else
           {
                
               // Count of set bits
               one++;
           }
            
           // Bitwise right shift
           num = num >> 1;
       }
        
       for(int j = zero; j < (one + zero); j++)
       {
            
          // Shifting all 1's to MSB
          // and 0's to LSB
          num += (1 << j);
       }
       System.out.print(num);
       i++;
        
       if (N > 0)
           System.out.print(", ");
    }
}
 
// Driver Code
public static void main(String args[])
{
    int arr[] = { 8, 15, 9, 10, 14 };
    int N = arr.length;
 
    maximizedArray(arr, N);
}
}
 
// This code is contributed by SoumikMondal


Python3




# Python3 implementation to find
# maximum sequence by swapping bits
 
# Function to generate the maximized
# array elements
def maximizedArray(arr, N):
     
    i = 0
     
    # Traverse the array
    while (N > 0):
        num = arr[i]
        one = 0
        zero = 0
         
        # Iterate to count set and
        # unset bits
        while (num):
             
            # Count of unset bits
            if (num % 2 == 0):
                zero += 1
     
            else:
 
                # Count of set bits
                one += 1
                 
            # Bitwise right shift
            num = num >> 1
             
        for j in range(zero, (one + zero)):
             
            # Shifting all 1's to MSB
            # and 0's to LSB
            num += (1 << j)
             
        print(num, end = "")
        i += 1
         
        if (N > 0):
            print(", ", end = "")
             
        N -= 1
         
# Driver Code
if __name__ == "__main__":
 
    arr = [ 8, 15, 9, 10, 14 ]
    N = len(arr)
 
    maximizedArray(arr, N)
 
# This code is contributed by chitranayal


C#




// C# implementation to find
// maximum sequence by swapping bits
using System;
class GFG{
 
// Function to generate the maximized
// array elements
public static void maximizedArray(int []arr,
                                  int N)
{
    int num, i = 0;
 
    // Traverse the array
    for(int l = N; l > 0; l--)
    {
        num = arr[i];
        int one = 0;
        int zero = 0;
             
        // Iterate to count set and
        // unset bits
        while (num != 0)
        {
                 
            // Count of unset bits
            if (num % 2 == 0)
            {
                zero++;
            }
            else
            {
                     
                // Count of set bits
                one++;
            }
                 
            // Bitwise right shift
            num = num >> 1;
        }
             
        for(int j = zero; j < (one + zero); j++)
        {
                 
            // Shifting all 1's to MSB
            // and 0's to LSB
            num += (1 << j);
        }
        Console.Write(num);
        i++;
             
        if (N > 0)
            Console.Write(", ");
    }
}
 
// Driver Code
public static void Main(String []args)
{
    int []arr = { 8, 15, 9, 10, 14 };
    int N = arr.Length;
 
    maximizedArray(arr, N);
}
}
 
// This code is contributed by sapnasingh4991


Javascript




<script>
// Javascript implementation to find
// maximum sequence by swapping bits
 
// Function to generate the maximized
// array elements
function maximizedArray(arr, N)
{
    let num, i = 0;
 
    // Traverse the array
    for(let l = N; l > 0; l--)
    {
       num = arr[i];
       let one = 0;
       let zero = 0;
        
       // Iterate to count set and
       // unset bits
       while (num != 0)
       {
            
           // Count of unset bits
           if (num % 2 == 0)
           {
               zero++;
           }
           else
           {
                
               // Count of set bits
               one++;
           }
            
           // Bitwise right shift
           num = num >> 1;
       }
        
       for(let j = zero; j < (one + zero); j++)
       {
            
          // Shifting all 1's to MSB
          // and 0's to LSB
          num += (1 << j);
       }
       document.write(num);
       i++;
        
       if (N > 0)
           document.write(", ");
    }
}
 
 
    // Driver Code
     
    let arr = [ 8, 15, 9, 10, 14 ];
    let N = arr.length;
 
    maximizedArray(arr, N);
 
</script>


Output: 

8, 15, 12, 12, 14

 

Time Complexity: O(Nlog2N) 
Auxiliary Space: O(1)
 


My Personal Notes arrow_drop_up
Last Updated : 12 May, 2021
Like Article
Save Article
Similar Reads
Related Tutorials