Sum of Bitwise OR of each array element of an array with all elements of another array
Last Updated :
11 Oct, 2022
Given two arrays arr1[] of size M and arr2[] of size N, the task is to find the sum of bitwise OR of each element of arr1[] with every element of the array arr2[].
Examples:
Input: arr1[] = {1, 2, 3}, arr2[] = {1, 2, 3}, M = 3, N = 3
Output: 7 8 9
Explanation:
For arr[0]: Sum = arr1[0]|arr2[0] + arr1[0]|arr2[1] + arr1[0]|arr2[2], Sum = 1|1 + 1|2 + 1|3 = 7
For arr[1], Sum = arr1[1]|arr2[0] + arr1[1]|arr2[1] + arr1[1]|arr2[2], Sum= 2|1 + 2|2 + 2|3 = 8
For arr[2], Sum = arr1[2]|arr2[0] + arr1[2]|arr2[1] + arr1[2]|arr2[2], Sum = 3|1 + 3|2 + 3|3 = 9
Input: arr1[] = {2, 4, 8, 16}, arr2[] = {2, 4, 8, 16}, M = 4, N = 4
Output: 36 42 54 78
Naive Approach: The simplest0 approach to solve this problem to traverse the array arr1[] and for each array element in the array arr[], calculate Bitwise OR of each element in the array arr2[].
Time Complexity: O(N2)
Auxiliary Space: O(N)
Efficient Approach: To optimize the above approach, the idea is to use Bit Manipulation to solve the above problem.
- According to the Bitwise OR property, while performing the operation, the ith bit will be set bit only when either of both numbers has a set bit at the ith position, where 0 ≤ i <32.
- Therefore, for a number in arr1[], if the ith bit is not a set bit, then the ith place will contribute a sum of K * 2i , where K is the total number in arr2[] having set bit at the ith position.
- Otherwise, if the number has a set bit at the ith place, then it will contribute a sum of N * 2i.
Follow the steps below to solve the problem:
- Initialize an integer array, say frequency[], to store the count of numbers in arr2[] having set-bit at ith position ( 0 ≤ i < 32).
- Traverse the array arr2[] and represent each array element in its binary form and increment the count in the frequency[] array by one at the positions having set bit in the binary representations.
- Traverse the array arr1[].
- Initialize an integer variable, say bitwise_OR_sum with 0.
- Traverse in the range [0, 31] using variable j.
- If the jth bit is set in the binary representation of arr2[i], then increment bitwise_OR_sum by N * 2j. Otherwise, increment by frequency[j] * 2j
- Print the sum obtained bitwise_OR_sum.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
void Bitwise_OR_sum_i( int arr1[], int arr2[],
int M, int N)
{
int frequency[32] = { 0 };
for ( int i = 0; i < N; i++) {
int bit_position = 0;
int num = arr1[i];
while (num) {
if (num & 1) {
frequency[bit_position] += 1;
}
bit_position += 1;
num >>= 1;
}
}
for ( int i = 0; i < M; i++) {
int num = arr2[i];
int value_at_that_bit = 1;
int bitwise_OR_sum = 0;
for ( int bit_position = 0;
bit_position < 32;
bit_position++) {
if (num & 1) {
bitwise_OR_sum
+= N * value_at_that_bit;
}
else {
bitwise_OR_sum
+= frequency[bit_position]
* value_at_that_bit;
}
num >>= 1;
value_at_that_bit <<= 1;
}
cout << bitwise_OR_sum << ' ' ;
}
return ;
}
int main()
{
int arr1[] = { 1, 2, 3 };
int arr2[] = { 1, 2, 3 };
int N = sizeof (arr1) / sizeof (arr1[0]);
int M = sizeof (arr2) / sizeof (arr2[0]);
Bitwise_OR_sum_i(arr1, arr2, M, N);
return 0;
}
|
Java
import java.util.*;
class GFG{
static void Bitwise_OR_sum_i( int arr1[], int arr2[],
int M, int N)
{
int frequency[] = new int [ 32 ];
Arrays.fill(frequency, 0 );
for ( int i = 0 ; i < N; i++)
{
int bit_position = 0 ;
int num = arr1[i];
while (num != 0 )
{
if ((num & 1 ) != 0 )
{
frequency[bit_position] += 1 ;
}
bit_position += 1 ;
num >>= 1 ;
}
}
for ( int i = 0 ; i < M; i++)
{
int num = arr2[i];
int value_at_that_bit = 1 ;
int bitwise_OR_sum = 0 ;
for ( int bit_position = 0 ;
bit_position < 32 ;
bit_position++)
{
if ((num & 1 ) != 0 )
{
bitwise_OR_sum += N * value_at_that_bit;
}
else
{
bitwise_OR_sum += frequency[bit_position] *
value_at_that_bit;
}
num >>= 1 ;
value_at_that_bit <<= 1 ;
}
System.out.print(bitwise_OR_sum + " " );
}
return ;
}
public static void main(String[] args)
{
int arr1[] = { 1 , 2 , 3 };
int arr2[] = { 1 , 2 , 3 };
int N = arr1.length;
int M = arr2.length;
Bitwise_OR_sum_i(arr1, arr2, M, N);
}
}
|
Python3
def Bitwise_OR_sum_i(arr1, arr2, M, N):
frequency = [ 0 ] * 32
for i in range (N):
bit_position = 0
num = arr1[i]
while (num):
if (num & 1 ! = 0 ):
frequency[bit_position] + = 1
bit_position + = 1
num >> = 1
for i in range (M):
num = arr2[i]
value_at_that_bit = 1
bitwise_OR_sum = 0
for bit_position in range ( 32 ):
if (num & 1 ! = 0 ):
bitwise_OR_sum + = N * value_at_that_bit
else :
bitwise_OR_sum + = (frequency[bit_position] *
value_at_that_bit)
num >> = 1
value_at_that_bit << = 1
print (bitwise_OR_sum, end = " " )
return
arr1 = [ 1 , 2 , 3 ]
arr2 = [ 1 , 2 , 3 ]
N = len (arr1)
M = len (arr2)
Bitwise_OR_sum_i(arr1, arr2, M, N)
|
C#
using System;
class GFG
{
static void Bitwise_OR_sum_i( int [] arr1, int [] arr2,
int M, int N)
{
int [] frequency = new int [32];
for ( int i = 0; i < 32; i++)
{
frequency[i] = 0;
}
for ( int i = 0; i < N; i++)
{
int bit_position = 0;
int num = arr1[i];
while (num != 0)
{
if ((num & 1) != 0)
{
frequency[bit_position] += 1;
}
bit_position += 1;
num >>= 1;
}
}
for ( int i = 0; i < M; i++)
{
int num = arr2[i];
int value_at_that_bit = 1;
int bitwise_OR_sum = 0;
for ( int bit_position = 0;
bit_position < 32;
bit_position++)
{
if ((num & 1) != 0)
{
bitwise_OR_sum += N * value_at_that_bit;
}
else
{
bitwise_OR_sum += frequency[bit_position] *
value_at_that_bit;
}
num >>= 1;
value_at_that_bit <<= 1;
}
Console.Write(bitwise_OR_sum + " " );
}
return ;
}
public static void Main()
{
int [] arr1 = { 1, 2, 3 };
int [] arr2 = { 1, 2, 3 };
int N = arr1.Length;
int M = arr2.Length;
Bitwise_OR_sum_i(arr1, arr2, M, N);
}
}
|
Javascript
<script>
function Bitwise_OR_sum_i(arr1, arr2, M, N) {
let frequency = new Array(32).fill(0);
for (let i = 0; i < N; i++) {
let bit_position = 0;
let num = arr1[i];
while (num) {
if (num & 1) {
frequency[bit_position] += 1;
}
bit_position += 1;
num >>= 1;
}
}
for (let i = 0; i < M; i++) {
let num = arr2[i];
let value_at_that_bit = 1;
let bitwise_OR_sum = 0;
for (let bit_position = 0; bit_position < 32; bit_position++) {
if (num & 1) {
bitwise_OR_sum += N * value_at_that_bit;
}
else {
bitwise_OR_sum += frequency[bit_position] * value_at_that_bit;
}
num >>= 1;
value_at_that_bit <<= 1;
}
document.write(bitwise_OR_sum + ' ' );
}
return ;
}
let arr1 = [1, 2, 3];
let arr2 = [1, 2, 3];
let N = arr1.length;
let M = arr2.length;
Bitwise_OR_sum_i(arr1, arr2, M, N);
</script>
|
Time Complexity: O(N*32)
Auxiliary Space: O(1) because size of frequency array is constant
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...