Numbers that are Bitwise AND of At Least One Non-Empty Sub-Array using C++


To solve a problem where we are given an array, and we need to find all possible integers which are bitwise AND of at least one not empty subarray, for example −

Input : nums[ ] = { 3, 5, 1, 2, 8 }
Output : { 2, 5, 0, 3, 8, 1 }
Explanation:
2 is the bitwise AND of subarray {2},
5 is the bitwise AND of subarray {5},
0 is the bitwise AND of subarray {1, 2}, {2, 8} and {1, 2, 8},
3 is the bitwise AND of subarray {3},
8 is the bitwise AND of subarray {8},
1 is the bitwise AND of subarray {1}, {3, 5} and {3, 5, 1}.

Input : nums[ ] = { 2, 6, 3, 8, 1 }
Output: { 1, 8, 3, 6, 2, 0 }

Approach to Find the Solution

A Simple Approach that can be applied is,

  • Find all the possible non-empty subarrays.

  • While traversing through the array, calculate the bitwise AND of each element in the subarray.

  • To avoid duplicate values, store all the results in a set.

Example

#include <bits/stdc++.h>
using namespace std;
int main(){
    int arr[] ={ 2, 6, 3, 8, 1 };
    int n = sizeof(arr) / sizeof(arr[0]);
    // Declaring set to store result of each AND operation.
    unordered_set<int> result;
    int val;
    // nested loops to traverse through all the possible non empty subarrays.
    for (int i = 0; i < n; ++i){
        for (int j = i, val = INT_MAX; j < n; ++j){
            val = val & arr[j];
            // storing result of AND operation
            result.insert(val);
        }
    }
    cout << "All possible numbers are: ";
    // printing all the values of set.
    for (auto i = result.begin(); i != result.end();i++)
        cout << *i << " ";
    return 0;
}

Output

All possible numbers are: 1 8 3 6 0 2

Explanation of the Above Code

  • Declaring set to store all the results of AND operation.

  • Initializing the ‘val’ variable with INT_MAX because we need to do AND operation with all the bits set to 1.

  • Inside loop to go through all possible subarrays from the ith index.

  • Calculating AND operation of each element with each other and with themselves and storing in the result set.

  • Printing all the values of the result set.

Conclusion

In this tutorial, We discussed a simple approach to solve this problem, i.e., calculating AND operation in every possible subarray. We also discussed the C++ program to solve this problem. Also, you can write this code in any other language like Java, C, Python, etc. We hope you find this tutorial helpful.

Updated on: 25-Nov-2021

80 Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements