Find XOR sum of Bitwise AND of all pairs from given two Arrays
Last Updated :
17 Apr, 2023
Given two arrays A and B of sizes N and M respectively, the task is to calculate the XOR sum of bitwise ANDs of all pairs of A and B
Examples:
Input: A={3, 5}, B={2, 3}, N=2, M=2
Output:
0
Explanation:
The answer is (3&2)^(3&3)^(5&2)^(5&3)=1^3^0^2=0.
Input: A={1, 2, 3}, B={5, 6}, N=3, M=2
Output:
0
Naive Approach: The naive approach would be to use nested loops to calculate the bitwise ANDs of all pairs and then find their XOR sum. Follow the steps below to solve the problem:
- Initialize a variable ans to -1, which will store that final answer.
- Traverse array A, and do the following:
- For each current element, traverse the array B, and do the following:
- If ans is equal to -1, store the bitwise AND of the elements in ans.
- Otherwise, store the bitwise XOR of ans and the bitwise AND of the elements in ans.
- Return ans.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
int XorSum( int A[], int B[], int N, int M)
{
int ans = -1;
for ( int i = 0; i < N; i++) {
for ( int j = 0; j < M; j++) {
if (ans == -1)
ans = (A[i] & B[j]);
else
ans ^= (A[i] & B[j]);
}
}
return ans;
}
int main()
{
int A[] = { 3, 5 };
int B[] = { 2, 3 };
int N = sizeof (A) / sizeof (A[0]);
int M = sizeof (B) / sizeof (B[0]);
cout << XorSum(A, B, N, M) << endl;
}
|
Java
import java.io.*;
class GFG
{
public static int XorSum( int A[], int B[], int N, int M)
{
int ans = - 1 ;
for ( int i = 0 ; i < N; i++)
{
for ( int j = 0 ; j < M; j++)
{
if (ans == - 1 )
ans = (A[i] & B[j]);
else
ans ^= (A[i] & B[j]);
}
}
return ans;
}
public static void main (String[] args)
{
int A[] = { 3 , 5 };
int B[] = { 2 , 3 };
int N = A.length;
int M =B.length;
System.out.println(XorSum(A, B, N, M));
}
}
|
Python3
def XorSum(A, B, N, M):
ans = - 1
for i in range (N):
for j in range (M):
if (ans = = - 1 ):
ans = (A[i] & B[j])
else :
ans ^ = (A[i] & B[j])
return ans
if __name__ = = '__main__' :
A = [ 3 , 5 ]
B = [ 2 , 3 ]
N = len (A)
M = len (B)
print (XorSum(A, B, N, M))
|
C#
using System;
using System.Collections.Generic;
class GFG{
static int XorSum( int []A, int []B, int N, int M)
{
int ans = -1;
for ( int i = 0; i < N; i++)
{
for ( int j = 0; j < M; j++)
{
if (ans == -1)
ans = (A[i] & B[j]);
else
ans ^= (A[i] & B[j]);
}
}
return ans;
}
public static void Main()
{
int []A = {3, 5};
int []B = {2, 3};
int N = A.Length;
int M = B.Length;
Console.Write(XorSum(A, B, N, M));
}
}
|
Javascript
<script>
function XorSum(A, B, N, M)
{
let ans = -1;
for (let i = 0; i < N; i++)
{
for (let j = 0; j < M; j++)
{
if (ans == -1)
ans = (A[i] & B[j]);
else
ans ^= (A[i] & B[j]);
}
}
return ans;
}
let A = [3, 5];
let B = [2, 3];
let N = A.length;
let M = B.length;
document.write(XorSum(A, B, N, M));
</script>
|
Time Complexity: O(N*M)
Auxiliary Space:O(1)
Efficient Approach:
Observation: The distributive property of XOR over AND can be used to solve the problem.
let A[] = [a, b, c]
let B[] = [d, e]
Result :
(a & d) ^ (a & e) ^ (b & d) ^ (b & e) ^ (c & d) ^ (c & e)
By applying distributive property,
[(a ^ b ^ c) & d] ^ [(a ^ b ^ e) & e]
(a ^ b ^ c) & (d ^ e)
Follow the steps below to solve the problem:
- Initialize two variables ans1 and ans2 to 0, which will store the bitwise XOR sums of the first array and the second array respectively.
- Traverse A and for each current element:
- Store the bitwise XOR of ans1 and the current element in ans1.
- Traverse B and for each current element:
- Store the bitwise XOR of ans2 and the current element in ans2.
- Return ans1&ans2.
Below is the implementation of the above approach:
C++14
#include <bits/stdc++.h>
using namespace std;
int XorSum( int A[], int B[], int N, int M)
{
int ans1 = 0, ans2 = 0;
for ( int i = 0; i < N; i++)
ans1 = ans1 ^ A[i];
for ( int i = 0; i < M; i++)
ans2 = ans2 ^ B[i];
return (ans1 & ans2);
}
int main()
{
int A[] = { 3, 5 };
int B[] = { 2, 3 };
int N = sizeof (A) / sizeof (A[0]);
int M = sizeof (B) / sizeof (B[0]);
cout << XorSum(A, B, N, M) << endl;
}
|
Java
import java.io.*;
class GFG{
static int XorSum( int A[], int B[], int N, int M)
{
int ans1 = 0 , ans2 = 0 ;
for ( int i = 0 ; i < N; i++)
ans1 = ans1 ^ A[i];
for ( int i = 0 ; i < M; i++)
ans2 = ans2 ^ B[i];
return (ans1 & ans2);
}
public static void main(String[] args)
{
int A[] = { 3 , 5 };
int B[] = { 2 , 3 };
int N = A.length;
int M = B.length;
System.out.print(XorSum(A, B, N, M));
}
}
|
Python3
def XorSum(A, B, N, M):
ans1 = 0
ans2 = 0
for i in range (N):
ans1 = ans1 ^ A[i]
for i in range (M):
ans2 = ans2 ^ B[i]
return (ans1 & ans2)
if __name__ = = '__main__' :
A = [ 3 , 5 ]
B = [ 2 , 3 ]
N = len (A)
M = len (B)
print (XorSum(A, B, N, M))
|
C#
using System;
class GFG {
static int XorSum( int [] A, int [] B, int N, int M)
{
int ans1 = 0, ans2 = 0;
for ( int i = 0; i < N; i++)
ans1 = ans1 ^ A[i];
for ( int i = 0; i < M; i++)
ans2 = ans2 ^ B[i];
return (ans1 & ans2);
}
public static void Main (String[] args)
{
int [] A = { 3, 5 };
int [] B = { 2, 3 };
int N = A.Length;
int M = B.Length;
Console.Write(XorSum(A, B, N, M));
}
}
|
Javascript
<script>
function XorSum(A, B, N, M)
{
let ans1 = 0, ans2 = 0;
for (let i = 0; i < N; i++)
ans1 = ans1 ^ A[i];
for (let i = 0; i < M; i++)
ans2 = ans2 ^ B[i];
return (ans1 & ans2);
}
let A = [ 3, 5 ];
let B = [ 2, 3 ];
let N = A.length;
let M = B.length;
document.write(XorSum(A, B, N, M));
</script>
|
Time Complexity: O(N+M)
Auxiliary Space: O(1)
Share your thoughts in the comments
Please Login to comment...