Sum of bit differences among all pairs
Given an integer array of n integers, find sum of bit differences in all pairs that can be formed from array elements. Bit difference of a pair (x, y) is count of different bits at same positions in binary representations of x and y.
For example, bit difference for 2 and 7 is 2. Binary representation of 2 is 010 and 7 is 111 ( first and last bits differ in two numbers).
Examples :
Input: arr[] = {1, 2}
Output: 4
All pairs in array are (1, 1), (1, 2)
(2, 1), (2, 2)
Sum of bit differences = 0 + 2 +
2 + 0
= 4
Input: arr[] = {1, 3, 5}
Output: 8
All pairs in array are (1, 1), (1, 3), (1, 5)
(3, 1), (3, 3) (3, 5),
(5, 1), (5, 3), (5, 5)
Sum of bit differences = 0 + 1 + 1 +
1 + 0 + 2 +
1 + 2 + 0
= 8
Source: Google Interview Question
Naive Solution:
A Simple Solution is to run two loops to consider all pairs one by one. For every pair, count bit differences. Finally return sum of counts. Time complexity of this solution is O(n2). We are using bitset::count() which is an inbuilt STL in C++ which returns the number of set bits in the binary representation of a number.
C++
#include <bits/stdc++.h>
using namespace std;
int sum_bit_diff(vector< int > a)
{
int n = a.size();
int ans = 0;
for ( int i = 0; i < n - 1; i++) {
int count = 0;
for ( int j = i; j < n; j++) {
int x = a[i] & a[j];
int y = a[i] | a[j];
bitset<32> b1(x);
bitset<32> b2(y);
int r1 = b1.count();
int r2 = b2.count();
count = abs (r1 - r2);
ans = ans + (2 * count);
}
}
return ans;
}
int main()
{
vector< int > nums{ 10, 5 };
int ans = sum_bit_diff(nums);
cout << ans;
}
|
Java
import java.io.*;
class GFG {
static int sumBitDiff( int [] arr){
int diff = 0 ;
for ( int i= 0 ; i<arr.length; i++){
for ( int j=i; j<arr.length; j++){
int xor = arr[i]^arr[j];
int count = countSetBits(xor);
diff += 2 *count;
}
}
return diff;
}
static int countSetBits( int n){
int count = 0 ;
while (n != 0 ) {
n = n & (n - 1 );
count++;
}
return count;
}
public static void main (String[] args) {
int [] arr = { 5 , 10 };
int ans = sumBitDiff(arr);
System.out.println(ans);
}
}
|
Python3
def sumBitDiff(arr):
diff = 0
for i in range ( len (arr)):
for j in range (i, len (arr)):
xor = arr[i]^arr[j]
count = countSetBits(xor)
diff + = ( 2 * count)
return diff
def countSetBits(n):
count = 0
while (n ! = 0 ) :
n = n & (n - 1 )
count + = 1
return count
if __name__ = = "__main__" :
arr = [ 5 , 10 ]
ans = sumBitDiff(arr)
print (ans)
|
C#
using System;
public class GFG {
static int sumBitDiff( int [] arr){
int diff = 0;
for ( int i=0; i<arr.Length; i++){
for ( int j=i; j<arr.Length; j++){
int xor = arr[i]^arr[j];
int count = countSetBits(xor);
diff += 2*count;
}
}
return diff;
}
static int countSetBits( int n){
int count = 0;
while (n != 0) {
n = n & (n - 1);
count++;
}
return count;
}
public static void Main(String[] args) {
int [] arr = {5,10};
int ans = sumBitDiff(arr);
Console.WriteLine(ans);
}
}
|
Javascript
<script>
function sumBitDiff(arr)
{
let diff = 0;
for (let i = 0; i < arr.length; i++){
for (let j = i; j < arr.length; j++){
let xor = arr[i]^arr[j];
let count = countSetBits(xor);
diff += 2*count;
}
}
return diff;
}
function countSetBits(n){
let count = 0;
while (n != 0) {
n = n & (n - 1);
count++;
}
return count;
}
let arr = [5,10];
let ans = sumBitDiff(arr);
document.write(ans);
</script>
|
Time Complexity: O(n2)
Auxiliary Space: O(1)
Efficient Solution :
An Efficient Solution can solve this problem in O(n) time using the fact that all numbers are represented using 32 bits (or some fixed number of bits). The idea is to count differences at individual bit positions. We traverse from 0 to 31 and count numbers with i’th bit set. Let this count be ‘count’. There would be “n-count” numbers with i’th bit not set. So count of differences at i’th bit would be “count * (n-count) * 2”, the reason for this formula is as every pair having one element which has set bit at i’th position and second element having unset bit at i’th position contributes exactly 1 to sum, therefore total permutation count will be count*(n-count) and multiply by 2 is due to one more repetition of all this type of pair as per given condition for making pair 1<=i, j<=N.
Below is implementation of above idea.
C++
#include <bits/stdc++.h>
using namespace std;
int sumBitDifferences( int arr[], int n)
{
int ans = 0;
for ( int i = 0; i < 32; i++) {
int count = 0;
for ( int j = 0; j < n; j++)
if ((arr[j] & (1 << i)))
count++;
ans += (count * (n - count) * 2);
}
return ans;
}
int main()
{
int arr[] = { 1, 3, 5 };
int n = sizeof arr / sizeof arr[0];
cout << sumBitDifferences(arr, n) << endl;
return 0;
}
|
C
#include <stdio.h>
int sumBitDifferences( int arr[], int n)
{
int ans = 0;
for ( int i = 0; i < 32; i++) {
int count = 0;
for ( int j = 0; j < n; j++)
if ((arr[j] & (1 << i)))
count++;
ans += (count * (n - count) * 2);
}
return ans;
}
int main()
{
int arr[] = { 1, 3, 5 };
int n = sizeof arr / sizeof arr[0];
printf ( "%d\n" , sumBitDifferences(arr, n));
return 0;
}
|
Java
import java.io.*;
class GFG {
static int sumBitDifferences( int arr[], int n)
{
int ans = 0 ;
for ( int i = 0 ; i < 32 ; i++) {
int count = 0 ;
for ( int j = 0 ; j < n; j++)
if ((arr[j] & ( 1 << i)) != 0 )
count++;
ans += (count * (n - count) * 2 );
}
return ans;
}
public static void main(String args[])
{
int arr[] = { 1 , 3 , 5 };
int n = arr.length;
System.out.println(sumBitDifferences(arr, n));
}
}
|
Python3
def sumBitDifferences(arr, n):
ans = 0
for i in range ( 0 , 32 ):
count = 0
for j in range ( 0 , n):
if ( (arr[j] & ( 1 << i)) ):
count + = 1
ans + = (count * (n - count) * 2 );
return ans
arr = [ 1 , 3 , 5 ]
n = len (arr )
print (sumBitDifferences(arr, n))
|
C#
using System;
class GFG {
static int sumBitDifferences( int [] arr,
int n)
{
int ans = 0;
for ( int i = 0; i < 32; i++) {
int count = 0;
for ( int j = 0; j < n; j++)
if ((arr[j] & (1 << i)) != 0)
count++;
ans += (count * (n - count) * 2);
}
return ans;
}
public static void Main()
{
int [] arr = { 1, 3, 5 };
int n = arr.Length;
Console.Write(sumBitDifferences(arr, n));
}
}
|
PHP
<?php
function sumBitDifferences( $arr , $n )
{
$ans = 0;
for ( $i = 0; $i < 32; $i ++)
{
$count = 0;
for ( $j = 0; $j < $n ; $j ++)
if (( $arr [ $j ] & (1 << $i )))
$count ++;
$ans += ( $count * ( $n -
$count ) * 2);
}
return $ans ;
}
$arr = array (1, 3, 5);
$n = sizeof( $arr );
echo sumBitDifferences( $arr , $n ), "\n" ;
?>
|
Javascript
<script>
function sumBitDifferences(arr, n)
{
let ans = 0;
for (let i = 0; i < 32; i++)
{
let count = 0;
for (let j = 0; j < n; j++)
if ((arr[j] & (1 << i)))
count++;
ans += (count * (n - count) * 2);
}
return ans;
}
let arr = [ 1, 3, 5 ];
let n = arr.length;
document.write(sumBitDifferences(arr, n));
</script>
|
Time Complexity: O(n)
Auxiliary Space: O(1)
Thanks to Gaurav Ahirwar for suggesting this solution.
Last Updated :
29 Jul, 2022
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...