C ++中数组中一对的最大按位AND值

问题陈述

给定n个正元素的数组。我们需要找到数组中任何一对元素生成的最大按位与值。

示例

如果输入数组是{10,12,15,18},则按位AND的最大值是12。

算法

当两个位均为1时,对单个位进行按位AND运算的结果最大。考虑到此属性-

  • 从MSB开始,检查是否至少有两个具有设置值的数组元素

  • 如果是,则该MSB将成为我们解决方案的一部分并被添加到结果中,否则我们将丢弃该位

  • 同样,从MSB到LSB(32:1)进行位位置迭代,我们可以轻松地检查哪个位将成为解决方案的一部分,并将所有此类位添加到我们的解决方案中

示例

现在让我们看一个例子-

#include <bits/stdc++.h>
using namespace std;
int checkBits(int *arr, int n, int pattern) {
   int cnt = 0;
   for (int i = 0; i < n; ++i) {
      if ((pattern & arr[i]) == pattern) {
         ++cnt;
      }
   }
   return cnt;
}
int getMaxBitwiseAnd(int *arr, int n) {
   int result = 0;
   int count;
   for (int i = 31; i >= 0; --i) {
      count = checkBits(arr, n, result | (1 << i));
      if (count >= 2) {
         result |= (1 << i);
      }
   }
   return result;
}
int main() {
   int arr[] = {10, 12, 15, 18};
   int n = sizeof(arr) / sizeof(arr[0]);
   cout << "Maximum bitwise AND = " << getMaxBitwiseAnd(arr, n) << endl;
   return 0;
}

输出结果

Maximum bitwise AND = 12