我必须用c ++编写一个函数,其中输入是2个二进制字符串,输出必须是一个与输入的两个字符串按位与的字符串。同样,输出必须具有两个输入中较短的长度。
例如 如果输入为:“ 0b000000”,“ 0b000000” 输出为:“ 0b000000”
如果输入为:“ 0b10101010”,“ 0b11111111” 输出为:“ 0b10101010”
如果输入为:“ 0b10”,“ 0b11111111” 输出为:“ 0b10”
如果输入为:“ 0b10101110”,“ 0b101” 输出为:“ 0b100”
这是我的代码:
string binaryAND(const string &number1, const string &number2) {
string first_sol = "";
string sol = "0b";
if (number1.length() < number2.length()) {
string number11 = "";
string number22 = "";
for (int i = 2; i < number1.size(); i++){
number11 += number1[i];
}
for (int i = 2; i < number2.size(); i++){
number22 += number2[i];
}
int num1_z = stoi(number11, nullptr, 2);
int num2_z = stoi(number22, nullptr, 2);
int sol_int = (num1_z & num2_z);
int i = number11.size();
while (i > -1){
first_sol = to_string(sol_int % 2) + first_sol;
sol_int /= 2;
i--;
}
sol += first_sol;
return sol;
}
if (number1.length() >= number2.length()){
string number11 = "";
string number22 = "";
for (int i = 2; i < number1.size(); i++){
number11 += number1[i];
}
for (int i = 2; i < number2.size(); i++){
number22 += number2[i];
}
int num1_z = stoi(number11, nullptr, 2);
int num2_z = stoi(number22, nullptr, 2);
int sol_int = (num1_z & num2_z);
int i = number22.size();
while (i > -1){
first_sol = to_string(sol_int % 2) + first_sol;
sol_int /= 2;
i--;
}
sol += first_sol;
return sol;
}
}
编辑: 但这行不通。 “ 0b”后面的输出比应有的多0。
例如,输出应为:“ 0b000000” 但它是:“ 0b0000000”
应为:“ 0b10101010” 但它是:“ 0b010101010”
应为:“ 0b100” 但它是:“ 0b0100”
我不知道如何更正代码。有什么想法吗?
答案 0 :(得分:1)
您的表达式无效:
sol + first_sol;
您可能打算使用
sol += first_sol;
在编辑后的版本中,您可能仍然经常迭代:使用
while (i > 0)
我个人建议使用一种很多更简单的方法:
std::string result;
auto min = std::min(number1.size(), number2.size());
std::transform(number1.begin(), number1.begin() + min,
number2.begin(),
std::back_inserter(result),
[](char a, char b){
return a == 'b'? 'b': "01"[a == '1' && b == '1'];
});
答案 1 :(得分:0)
因此,除了@DietmarKuhl的好答案之外,请注意他正在尝试教给您的“课”:您可以通过简单地使用标准库算法(例如std::transform
)来实现很多功能-因此,花一些时间研究它们很重要。
此外,即使您只是想实现自己的解决方案-您也有几个循环,它们实际上与调用std::copy_n()
相同;等等。
最后-短期解决方案有所不同,恕我直言更好地遵循了"principle of least astonishment":
std::string result {"0b"};
auto min = std::min(number1.size(), number2.size());
std::transform(
number1.begin() + 2,
number1.begin() + min,
number2.begin() + 2,
std::back_inserter(result),
[](char a, char b){ return ((a == '1') and (b == '1')) ? '1' : '0'; }
);