Sum of bitwise AND of all possible subsets of given set

Given an array, we need to calculate the Sum of Bit-wise AND of all possible subsets of given array.

Examples:

Input : 1 2 3
Output : 9
For [1, 2, 3], all possible subsets are {1}, 
{2}, {3}, {1, 2}, {1, 3}, {2, 3}, {1, 2, 3}
Bitwise AND of these subsets are, 1 + 2 + 
3 + 0 + 1 + 2 + 0 = 9.
So, the answer would be 9.

Input : 1 2 3 4
Output : 13


Refer this Post for Count Set Bit
Naive Approach, we can produce all subset using Power Set then calculate Bit-wise AND sum of all subset.

A Better approach, we are trying to calculate which array element is responsible in producing the sum into subset.
Let’s start with the least significant bit. To remove the contribution from other bits, we calculate number AND bit for all numbers in the set. Any subset of this that contain a 0 will not give any contribution. All nonempty subset that only consist of 1’s will give 1 in contribution. In total there will be 2^n – 1 such subset each giving 1 in contribution. Same goes for the the other bit. We get [0, 2, 2], 3 subset each giving 2. Total 3*1 + 3*2 = 9

Array = {1, 2, 3}
Binary representation
positions       2 1 0    
        1       0 0 1
        2       0 1 0
        3       0 1 1
              [ 0 2 2 ]
Count set bit for each position
[ 0 3 3 ] subset produced by each 
position 2^n -1 i.e. n is total sum 
for each position [ 0, 3*2^1, 3*2^0 ] 
Now calculate the sum by multiplying 
the position value i.e 2^0, 2^1 ... . 
 0 + 6 + 3 = 9

CPP

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ program to calculate sum of Bit-wise 
// and sum of all subsets of an array
#include <bits/stdc++.h>
using namespace std;
  
#define BITS 32
  
int andSum(int arr[], int n)
{
    int ans = 0;
  
    // assuming representation of each element is
    // in 32 bit
    for (int i = 0; i < BITS; i++) {
        int countSetBits = 0;
  
        // iterating array element
        for (int j = 0; j < n; j++) {
  
            // Counting the set bit of array in
            // ith position
            if (arr[j] & (1 << i))
                countSetBits++;
        }
  
        // counting subset which produce sum when
        // particular bit position is set.
        int subset = (1 << countSetBits) - 1;
  
        // multiplying every position subset with 2^i
        // to count the sum.
        subset = (subset * (1 << i));
  
        ans += subset;
    }
  
    return ans;
}
  
// Drivers code
int main()
{
    int arr[] = { 1, 2, 3};
    int size = sizeof(arr) / sizeof(arr[0]);
    cout << andSum(arr, size);
  
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java program to calculate sum of Bit-wise 
// and sum of all subsets of an array
class GFG {
      
    static final int BITS = 32;
      
    static int andSum(int arr[], int n)
    {
        int ans = 0;
      
        // assuming representation of each
        // element is in 32 bit
        for (int i = 0; i < BITS; i++) {
            int countSetBits = 0;
      
            // iterating array element
            for (int j = 0; j < n; j++) {
      
                // Counting the set bit of
                // array in ith position
                if ((arr[j] & (1 << i)) != 0)
                    countSetBits++;
            }
      
            // counting subset which produce
            // sum when particular bit 
            // position is set.
            int subset = (1 << countSetBits) - 1;
      
            // multiplying every position 
            // subset with 2^i to count the
            // sum.
            subset = (subset * (1 << i));
      
            ans += subset;
        }
      
        return ans;
    }
      
    // Drivers code
    public static void main(String args[])
    {
        int arr[] = { 1, 2, 3};
        int size = 3;
        System.out.println (andSum(arr, size));
      
    }
}
  
// This code is contributed by Arnab Kundu.

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python3 program to calculate sum of
# Bit-wise and sum of all subsets of
# an array
  
BITS = 32;
  
def andSum(arr, n):
    ans = 0
      
    # assuming representation 
    # of each element is
    # in 32 bit
    for i in range(0, BITS):
        countSetBits = 0
  
        # iterating array element
        for j in range(0, n) :
              
            # Counting the set bit 
            # of array in ith
            # position
            if (arr[j] & (1 << i)) :
                countSetBits = (countSetBits
                                       + 1)
  
        # counting subset which 
        # produce sum when 
        # particular bit position
        # is set.
        subset = ((1 << countSetBits) 
                                 - 1)
  
        # multiplying every position 
        # subset with 2^i to count 
        # the sum.
        subset = (subset * (1 << i))
  
        ans = ans + subset
  
    return ans
  
# Driver code
arr = [1, 2, 3]
size = len(arr)
print (andSum(arr, size))
      
# This code is contributed by 
# Manish Shaw (manishshaw1)

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# program to calculate sum of Bit-wise 
// and sum of all subsets of an array
using System;
  
class GFG {
      
static int BITS = 32;
  
    static int andSum(int[] arr, int n)
    {
        int ans = 0;
      
        // assuming representation of each
        // element is in 32 bit
        for (int i = 0; i < BITS; i++) {
            int countSetBits = 0;
      
            // iterating array element
            for (int j = 0; j < n; j++) {
      
                // Counting the set bit of
                // array in ith position
                if ((arr[j] & (1 << i)) != 0)
                    countSetBits++;
            }
      
            // counting subset which produce
            // sum when particular bit position
            // is set.
            int subset = (1 << countSetBits) - 1;
      
            // multiplying every position subset
            // with 2^i to count the sum.
            subset = (subset * (1 << i));
      
            ans += subset;
        }
      
        return ans;
    }
      
    // Drivers code
    static public void Main()
    {
        int []arr = { 1, 2, 3};
        int size = 3;
        Console.WriteLine (andSum(arr, size));
      
    }
}
  
// This code is contributed by Arnab Kundu.

chevron_right


PHP

filter_none

edit
close

play_arrow

link
brightness_4
code

<?php
// PHP program to calculate sum of Bit-wise 
// and sum of all subsets of an array
  
$BITS = 32;
  
function andSum( $arr, $n)
{
    global $BITS;
    $ans = 0;
  
    // assuming representation 
    // of each element is
    // in 32 bit
    for($i = 0; $i < $BITS; $i++)
    {
        $countSetBits = 0;
  
        // iterating array element
        for ( $j = 0; $j < $n; $j++) {
  
            // Counting the set bit 
            // of array in ith position
            if ($arr[$j] & (1 << $i))
                $countSetBits++;
        }
  
        // counting subset which 
        // produce sum when 
        // particular bit position
        // is set.
        $subset = (1 << $countSetBits) - 1;
  
        // multiplying every position 
        // subset with 2^i to count 
        // the sum.
        $subset = ($subset * (1 << $i));
  
        $ans += $subset;
    }
  
    return $ans;
}
  
    // Driver code
    $arr = array(1, 2, 3);
    $size = count($arr);
    echo andSum($arr, $size);
      
// This code is contributed by anuj_67.
?>

chevron_right


Output:

9


My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.



Improved By : andrew1234, vt_m, manishshaw1



Article Tags :
Practice Tags :


Be the First to upvote.


Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.