এই সমস্যাতে, আমাদের n আকারের একটি bin[] অ্যারে দেওয়া আছে যা বাইনারি স্ট্রিং ধারণ করে। আমাদের কাজ হলো N বাইনারি স্ট্রিং-এর বিটওয়াইজ AND (&) বের করার প্রোগ্রাম লিখা।
এখানে, আমরা সব নম্বর নেব এবং তাদের বিটওয়াইজ AND করব অর্থাৎ bin[0] & bin[1] &... bin[n-2] & bin[n]
উদাহরণ দিয়ে বুঝি,
ইনপুট −
bin[] = {"1001", "11001", "010101"}আউটপুট −
000001
ব্যাখ্যা − সব বাইনারি স্ট্রিং-এর বিটওয়াইজ AND −
(1001) & (11001) & (010101) = 000001
এই সমস্যা সমাধানের একটি সরাসরি এবং সহজ পদ্ধতি হচ্ছে দুটি বাইনারি স্ট্রিং-এর বিটওয়াইজ AND বের করা এবং তারপর রেজাল্টকে পরের স্ট্রিং-এর সাথে বিটওয়াইজ AND করা। এভাবে শেষ স্ট্রিং পর্যন্ত চলতে থাকা।
বেসিক অ্যালগরিদম হবে −
প্রাথমিকভাবে → result = bin[0] and i = 1
স্টেপ ১ − অ্যারে শেষ হওয়া পর্যন্ত স্টেপ ২ এবং ৩ রিপিট করুন।
স্টেপ ২ − result = result & bin[i]
স্টেপ ৩ − i++;
স্টেপ ৪ − রেজাল্ট প্রিন্ট করুন।
এখন, এই পদ্ধতির সাহায্যে উদাহরণটি সমাধান করি −
bin[] = {"1001", "11001", "010101"} result = bin[0] = 1001, i = 1ইটেরেশন ১ −
result = 1001 & 11001 = 01001 i = 2
ইটেরেশন ২ −
result = 01001 & 010101 = 000001 i = 3. END
উদাহরণ
উপরোক্ত সমাধানের প্রোগ্রাম,
#include <iostream>
using namespace std;
int changeLength(string &a, string &b){
int lengtha = a.length();
int lengthb = b.length();
int zeros = abs(lengtha-lengthb);
if (lengtha<lengthb) {
for (int i = 0 ; i<zeros; i++)
a = '0' + a;
return lengthb;
}
else {
for (int i = 0 ; i<zeros; i++)
b = '0' + b;
}
return lengtha;
}
string bitwiseAND(string binary1, string binary2){
int length = changeLength(binary1,binary2);
string result = "";
for (int i = 0 ; i<length; i++){
result = result+(char)((binary1[i] - '0' & binary2[i]-'0')+'0');
}
return result;
}
int main(){
string bin[] = {"1001", "11001", "010101"};
int n = sizeof(bin)/sizeof(bin[0]);
string result;
if (n<2){
cout<<bin[n-1]<<endl;
}
else{
result = bin[0];
for (int i = 1; i<n; i++)
result = bitwiseAND(result, bin[i]);
cout <<result<<endl;
}
}আউটপুট
000001
এই পদ্ধতি সহজ কিন্তু সবচেয়ে দক্ষ নয় কারণ স্ট্রিং ট্রাভার্স করতে হয়।
আরো একটি দক্ষ সমাধান আলোচনা করি,
এখানে, আমরা বাইনারি নম্বরের সবচেয়ে ছোট এবং বড় বিটের আকার বের করব। তারপর প্রতিটি বিটের বিটওয়াইজ AND বের করব এবং শেষে আগে লিডিং ০ যোগ করব (০-এর সংখ্যা হবে বড় - ছোট)।
নমুনা উদাহরণ দিয়ে সমাধান বুঝি,
bin[] = {"1001", "11001", "010101"} Largest = 010101 smallest = 1001 010101 & 1001 = 00001উদাহরণ
উপরোক্ত পদ্ধতির ইমপ্লিমেন্টেশন প্রোগ্রাম −
#include <bits/stdc++.h>
using namespace std;
string bitwiseANDarray(string* bin, int n){
string result;
int minSize = INT_MAX;
int maxSize = INT_MIN;
for (int i = 0; i < n; i++) {
reverse(bin[i].begin(), bin[i].end());
minSize = min(minSize, (int)bin[i].size());
maxSize = max(maxSize, (int)bin[i].size());
}
for (int i = 0; i < minSize; i++) {
bool setBit = true;
for (int j = 0; j < n; j++) {
if (bin[j][i] == '0') {
setBit = false;
break;
}
}
result += (setBit ? '1' : '0');
}
for (int i = 0; i<abs(maxSize-minSize); i++)
result += '0';
reverse(result.begin(), result.end());
return result;
}
int main(){
string arr[] = {"1001", "11001", "010101"};
int n = sizeof(arr) / sizeof(arr[0]);
cout<<bitwiseANDarray(arr, n);
return 0;
}আউটপুট
000001