Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> C++

C++ में N बाइनरी स्ट्रिंग्स का बिटवाइज AND


समस्या विवरण

इस समस्या में, हमें आकार 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 ढूंढना और अंतिम स्ट्रिंग तक जारी रखना है।

बुनियादी एल्गोरिदम होगा -

प्रारंभ में → परिणाम = bin[0] और i = 1

चरण 1 - चरण 2 और 3 को तब तक दोहराएं जब तक सरणी समाप्त न हो जाए।

चरण 2 - परिणाम = परिणाम & bin[i]

चरण 3 - i++;

चरण 4 - परिणाम प्रिंट करें।

अब, आइए इस दृष्टिकोण की मदद से उदाहरण हल करें -

bin[] = {"1001", "11001", "010101"} परिणाम = bin[0] = 1001, i = 1

पुनरावृत्ति 1 -

परिणाम = 1001 & 11001 = 01001 i = 2

पुनरावृत्ति 2 -

परिणाम = 01001 & 010101 = 000001 i = 3. अंत

कार्यक्रम उदाहरण (सरल दृष्टिकोण)

#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"} सबसे बड़ा = 010101 सबसे छोटा = 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++ में वृत्त और आयत के ओवरलैप की जांच C++ में वृत्त और आयत के ओवरलैप की जांच

    मान लीजिए हमारे पास एक वृत्त है जिसे (त्रिज्या, xc, yc) से दर्शाया जाता है, जहां (xc, yc) केंद्र के निर्देशांक हैं। हमारे पास एक अक्ष-संरेखित आयत भी है जिसे (x1, y1, x2, y2) से दर्शाया जाता है, जहां (x1, y1) निचले-बाएं कोने के निर्देशांक हैं और (x2, y2) ऊपरी-दाएं कोने के निर्देशांक हैं। हमें जांचना

  1. बाइनरी ट्री को सीरियलाइज़ और डिसीरियलाइज़ करें - C++ बाइनरी ट्री को सीरियलाइज़ और डिसीरियलाइज़ करें - C++

    मान लीजिए हमारे पास एक बाइनरी ट्री है और हमें उन्हें सीरियलाइज़ और डिसीरियलाइज़ करना है। जैसा कि हम जानते हैं कि सीरियलाइज़ेशन एक डेटा संरचना या ऑब्जेक्ट को बिट्स के अनुक्रम में बदलने की प्रक्रिया है ताकि हम उन्हें फाइल या मेमोरी बफर में स्टोर कर सकें, और बाद में उसी या दूसरे कंप्यूटर वातावरण में पु

  1. - C++ और C# में Foreach लूप

    C++ में Foreach लूप C++11 ने foreach लूप (रेंज-बेस्ड फॉर लूप) पेश किया जो कंटेनर के प्रत्येक एलिमेंट को ट्रैवर्स करता है। उदाहरण: #include <iostream> using namespace std; int main() { int myArr[] = { 99, 15, 67 }; // foreach लूप for (int ele : myArr) cout << ele << e