Sum of Bitwise XOR of each array element with all other array elements
Last Updated :
09 Apr, 2021
Given an array arr[] of length N, the task for every array element is to print the sum of its Bitwise XOR with all other array elements.
Examples:
Input: arr[] = {1, 2, 3}
Output: 5 4 3
Explanation:
For arr[0]: arr[0] ^ arr[0] + arr[0] ^ arr[1] + arr[0] ^ arr[2] = 1^1 + 1^2 + 1^3 = 0 + 3 + 2 = 5
For arr[1]: arr[1] ^ arr[0] + arr[1] ^ arr[1] + arr[1] ^ arr[2] = 2^1 + 2^2 + 2^3 = 3 + 0 + 1 = 4
For arr[2]: arr[2] ^ arr[0] + arr[2] ^ arr[1] + arr[2] ^ arr[2] = 3^1 + 3^2 + 3^3 = 2 + 2 + 0 = 3
Input : arr[] = {2, 4, 8}
Output: 16 18 22
Explanation:
For arr[0]: arr[0] ^ arr[0] + arr[0] ^ arr[1] + arr[0] ^ arr[2] = 2^2 + 2^4 + 2^8 = 0 + 6 + 10 = 16.
For arr[1]: arr[1] ^ arr[0] + arr[1] ^ arr[1] + arr[1] ^ arr[2] = 4^2 + 4^4 + 4^8 = 6 + 0 + 12 = 18
For arr[2]: arr[2] ^ arr[0] + arr[2] ^ arr[1] + arr[2] ^ arr[2] = 8^2 + 8^4 + 8^8 = 10 + 12 + 0 = 22
Naive Approach: The idea is to traverse the array and for each array element, traverse the array and calculate sum of its Bitwise XOR with all other array elements.
Time Complexity: O(N2)
Auxiliary Space: O(N)
Efficient Approach: To` optimize the above approach, the idea is to use property of Bitwise XOR that similar bits on xor, gives 0, or 1 otherwise. Follow the below steps to solve the problem:
- Calculate the frequency of set bits at position i where 0 <= i <= 32, across all the elements of the array in a frequency array.
- For every element X, of the array, calculate the xor sum by running a loop from i=0 to 32 and check if ith bit of X is set.
- If yes, then add (N – frequency[i])*2i to the xor sum because the set bit of X at this position will make all the set bits to zero and all the unset bits to 1.
- Otherwise, add frequency[i] * 2i to the xor sum.
- Calculate the sum of all the xor sum of every element of the array and return as the answer.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
void XOR_for_every_i( int A[], int N)
{
int frequency_of_bits[32]{};
for ( int i = 0; i < N; i++) {
int bit_position = 0;
int M = A[i];
while (M) {
if (M & 1) {
frequency_of_bits[bit_position] += 1;
}
bit_position += 1;
M >>= 1;
}
}
for ( int i = 0; i < N; i++) {
int M = A[i];
int value_at_that_bit = 1;
int XOR_sum = 0;
for ( int bit_position = 0;
bit_position < 32;
bit_position++) {
if (M & 1) {
XOR_sum
+= (N
- frequency_of_bits[bit_position])
* value_at_that_bit;
}
else {
XOR_sum
+= (frequency_of_bits[bit_position])
* value_at_that_bit;
}
M >>= 1;
value_at_that_bit <<= 1;
}
cout << XOR_sum << ' ' ;
}
return ;
}
int main()
{
int A[] = { 1, 2, 3 };
int N = sizeof (A) / sizeof (A[0]);
XOR_for_every_i(A, N);
return 0;
}
|
Java
import java.util.*;
class GFG{
static void XOR_for_every_i( int A[], int N)
{
int frequency_of_bits[] = new int [ 32 ];
for ( int i = 0 ; i < N; i++)
{
int bit_position = 0 ;
int M = A[i];
while (M != 0 )
{
if ((M & 1 ) != 0 )
{
frequency_of_bits[bit_position] += 1 ;
}
bit_position += 1 ;
M >>= 1 ;
}
}
for ( int i = 0 ; i < N; i++)
{
int M = A[i];
int value_at_that_bit = 1 ;
int XOR_sum = 0 ;
for ( int bit_position = 0 ;
bit_position < 32 ;
bit_position++)
{
if ((M & 1 ) != 0 )
{
XOR_sum += (N -
frequency_of_bits[bit_position]) *
value_at_that_bit;
}
else
{
XOR_sum += (frequency_of_bits[bit_position]) *
value_at_that_bit;
}
M >>= 1 ;
value_at_that_bit <<= 1 ;
}
System.out.print( XOR_sum + " " );
}
return ;
}
public static void main(String[] args)
{
int A[] = { 1 , 2 , 3 };
int N = A.length;
XOR_for_every_i(A, N);
}
}
|
Python3
def XOR_for_every_i(A, N):
frequency_of_bits = [ 0 ] * 32
for i in range (N):
bit_position = 0
M = A[i]
while (M):
if (M & 1 ! = 0 ):
frequency_of_bits[bit_position] + = 1
bit_position + = 1
M >> = 1
for i in range (N):
M = A[i]
value_at_that_bit = 1
XOR_sum = 0
for bit_position in range ( 32 ):
if (M & 1 ! = 0 ):
XOR_sum + = ((N - frequency_of_bits[bit_position]) *
value_at_that_bit)
else :
XOR_sum + = ((frequency_of_bits[bit_position]) *
value_at_that_bit)
M >> = 1
value_at_that_bit << = 1
print (XOR_sum, end = " " )
return
A = [ 1 , 2 , 3 ]
N = len (A)
XOR_for_every_i(A, N)
|
C#
using System;
class GFG
{
static void XOR_for_every_i( int [] A, int N)
{
int [] frequency_of_bits = new int [32];
for ( int i = 0; i < N; i++)
{
int bit_position = 0;
int M = A[i];
while (M != 0)
{
if ((M & 1) != 0)
{
frequency_of_bits[bit_position] += 1;
}
bit_position += 1;
M >>= 1;
}
}
for ( int i = 0; i < N; i++)
{
int M = A[i];
int value_at_that_bit = 1;
int XOR_sum = 0;
for ( int bit_position = 0;
bit_position < 32;
bit_position++)
{
if ((M & 1) != 0)
{
XOR_sum += (N -
frequency_of_bits[bit_position]) *
value_at_that_bit;
}
else
{
XOR_sum += (frequency_of_bits[bit_position]) *
value_at_that_bit;
}
M >>= 1;
value_at_that_bit <<= 1;
}
Console.Write( XOR_sum + " " );
}
return ;
}
public static void Main()
{
int [] A = { 1, 2, 3 };
int N = A.Length;
XOR_for_every_i(A, N);
}
}
|
Javascript
<script>
function XOR_for_every_i(A, N)
{
let frequency_of_bits = new Uint8Array(32);
for (let i = 0; i < N; i++)
{
let bit_position = 0;
let M = A[i];
while (M != 0)
{
if ((M & 1) != 0)
{
frequency_of_bits[bit_position] += 1;
}
bit_position += 1;
M >>= 1;
}
}
for (let i = 0; i < N; i++)
{
let M = A[i];
let value_at_that_bit = 1;
let XOR_sum = 0;
for (let bit_position = 0;
bit_position < 32;
bit_position++)
{
if ((M & 1) != 0)
{
XOR_sum += (N -
frequency_of_bits[bit_position]) *
value_at_that_bit;
}
else
{
XOR_sum += (frequency_of_bits[bit_position]) *
value_at_that_bit;
}
M >>= 1;
value_at_that_bit <<= 1;
}
document.write( XOR_sum + " " );
}
return ;
}
let A = [ 1, 2, 3 ];
let N = A.length;
XOR_for_every_i(A, N);
</script>
|
Time Complexity: O(N)
Auxiliary Space: O(N)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...