C++中N個二進位制字串的按位與
在這個問題中,我們得到一個大小為n的二進位制字串陣列bin[]。我們的任務是編寫一個程式來查詢N個二進位制字串的按位與(&)。
在這裡,我們將取所有數字並找到它們的按位與,即bin[0] & bin[1] &... bin[n-2] & bin[n]
讓我們舉個例子來理解這個問題:
輸入 −
bin[] = {“1001”, “11001”, “010101”}輸出 −
000001
解釋 −所有二進位制字串的按位與−
(1001) & (11001) & (010101) = 000001
為了解決這個問題,一種直接而簡單的方法是找到兩個二進位制字串的按位與,然後找到結果與下一個字串的按位與,依次類推,直到陣列的最後一個字串。
基本演算法如下:
初始 → result = bin[0] and i = 1
步驟1 − 重複步驟2和3,直到陣列結束。
步驟2 − result = result & bin[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
這種方法很簡單,但不是最有效的方法,因為它需要遍歷字串。
讓我們討論一個更有效的解決方案:
在這裡,我們將找到二進位制數中最小的位和最大的位的數量。然後,我們將找到每個位的按位與,最後我們將新增前導0(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
廣告
資料結構
網路
關係資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP