কম্পিউটার

C++-এ N বাইনারি স্ট্রিং-এর Bitwise AND


এই সমস্যায়, আমাদের বাইনারি স্ট্রিংগুলির n আকারের একটি অ্যারে বিন [] দেওয়া হয়েছে। আমাদের কাজ হল N বাইনারি স্ট্রিংগুলির Bitwise AND (&) খুঁজে বের করার জন্য একটি প্রোগ্রাম তৈরি করা।

এখানে, আমরা সমস্ত সংখ্যা নেব এবং বিটওয়াইজ AND খুঁজে বের করব যেমন bin[0] এবং bin[1] &... bin[n-2] এবং bin[n]

সমস্যাটি বোঝার জন্য একটি উদাহরণ নেওয়া যাক,

ইনপুট

bin[] = {“1001”, “11001”, “010101”}

আউটপুট

000001

ব্যাখ্যা − Bitwise AND of all binary string −

(1001) & (11001) & (010101) = 000001

এই সমস্যাটি সমাধান করার জন্য, একটি প্রত্যক্ষ এবং সহজ পদ্ধতি হল দুটি বাইনারি স্ট্রিং এর বিটওয়াইজ AND খুঁজে বের করা এবং তারপরে পরবর্তীটির সাথে ফলাফলের বিটওয়াইজ AND খুঁজে বের করা এবং অ্যারের শেষ স্ট্রিং পর্যন্ত এগিয়ে যাওয়া।

বেসিক অ্যালগরিদম হবে −

প্রাথমিকভাবে → ফলাফল =বিন[0] এবং i =1

ধাপ 1 − অ্যারে শেষ না হওয়া পর্যন্ত পদক্ষেপ 2 এবং 3 পুনরাবৃত্তি করুন৷

ধাপ 2 − ফলাফল =ফলাফল এবং বিন[i]

ধাপ 3 − i++;

পদক্ষেপ 4৷ - ফলাফল প্রিন্ট করুন।

এখন, এই পদ্ধতির সাহায্যে উদাহরণটি সমাধান করা যাক −

bin[] = {“1001”, “11001”, “010101”}
result = bin[0] = 1001, i = 1

পুনরাবৃত্তি 1

result = 1001 & 11001 = 01001
i = 2

পুনরাবৃত্তি 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 খুঁজে পাব এবং শেষে আমরা 0 এর পূর্ববর্তী যোগ করব (শূন্যের সংখ্যা হবে সবচেয়ে বড় - সবচেয়ে ছোট)।

সমাধানটি পরিষ্কার করার জন্য একটি নমুনা উদাহরণ নেওয়া যাক,

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

  1. C++ এ বৃত্ত এবং আয়তক্ষেত্র ওভারল্যাপিং

  2. C++ এ বাইনারি ট্রি সিরিয়ালাইজ এবং ডিসিরিয়ালাইজ করুন

  3. C++ এ বাইনারি অনুসন্ধান

  4. সি++ এবং সি#-এ ফরিচ