Computer >> Máy Tính >  >> Lập trình >> C ++

Bitwise AND của N chuỗi nhị phân trong C ++

Trong bài toán này, chúng ta được cung cấp một bin mảng [] kích thước n của các chuỗi nhị phân. Nhiệm vụ của chúng tôi là tạo một chương trình để tìm Bitwise AND (&) của N chuỗi nhị phân.

Ở đây, chúng tôi sẽ lấy tất cả các số và tìm theo chiều kim loại VÀ trong số đó, tức là bin [0] &bin [1] &... bin [n-2] &bin [n]

Hãy lấy một ví dụ để hiểu vấn đề,

Đầu vào -

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

Đầu ra -

000001

Giải thích - Bitwise AND của tất cả chuỗi nhị phân -

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

Để giải quyết vấn đề này, một cách tiếp cận trực tiếp và đơn giản là tìm AND theo chiều dọc của hai chuỗi nhị phân và sau đó tìm AND theo chiều bit của kết quả với chuỗi tiếp theo và tiếp tục cho đến chuỗi cuối cùng của mảng.

Thuật toán cơ bản sẽ là -

ban đầu → result =bin [0] và i =1

Bước 1 - Lặp lại bước 2 và 3 cho đến khi mảng kết thúc.

Bước 2 - result =result &bin [i]

Bước 3 - i ++;

Bước 4 - in kết quả.

Bây giờ, hãy giải quyết ví dụ với sự trợ giúp của phương pháp này -

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

Lặp lại 1 -

result = 1001 & 11001 = 01001
i = 2

Lặp lại 2 -

result = 01001 & 010101 = 000001
i = 3. END

Ví dụ

Chương trình minh họa giải pháp trên,

#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;
   }
}

Đầu ra

000001

Cách tiếp cận này dễ dàng nhưng không phải là cách hiệu quả nhất vì nó cần phải duyệt qua chuỗi.

Hãy thảo luận về một giải pháp hiệu quả hơn,

Ở đây, chúng ta sẽ tìm kích thước của các bit nhỏ nhất và lớn nhất của số nhị phân. Sau đó, chúng tôi sẽ tìm theo từng bit VÀ của mỗi bit của số và ở cuối chúng tôi sẽ thêm các số 0 vào trước (số của số không sẽ là lớn nhất - nhỏ nhất).

Hãy lấy một ví dụ mẫu để làm rõ giải pháp,

bin[] = {"1001", "11001", "010101"}
Largest = 010101 smallest = 1001
010101 & 1001 = 00001

Ví dụ

Chương trình cho thấy việc thực hiện phương pháp trên -

#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;
}

Đầu ra

000001