คำชี้แจงปัญหา
รับอาร์เรย์ขององค์ประกอบบวก n เราจำเป็นต้องค้นหาค่าบิตสูงสุดและค่าที่สร้างโดยคู่ขององค์ประกอบจากอาร์เรย์
ตัวอย่าง
หากอาร์เรย์อินพุตคือ {10, 12, 15, 18} ค่าสูงสุดของระดับบิต AND คือ 12
อัลกอริทึม
ผลลัพธ์ของการดำเนินการระดับบิต AND ในบิตเดียวจะสูงสุดเมื่อทั้งสองบิตเป็น 1 เมื่อพิจารณาคุณสมบัตินี้ -
- เริ่มจาก 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