和两个二进制字符串 我必须在C++中编写一个函数,其中输入是2个二进制字符串,输出必须是一个字符串,它是两个输入的字符串的位。此外,输出必须具有两个输入中较短的长度
比如说 如果输入为:“0b000000”,“0b000000” 输出为:“0b000000” 如果输入为:“0b10101010”,“0b11111111” 输出为:“0b10101010” 如果输入为:“0b10”、“0b11111111” 输出为:“0b10” 如果输入为:“0b10101110”,“0b101” 输出为:“0b100” 这是我的密码:和两个二进制字符串 我必须在C++中编写一个函数,其中输入是2个二进制字符串,输出必须是一个字符串,它是两个输入的字符串的位。此外,输出必须具有两个输入中较短的长度,c++,C++,比如说 如果输入为:“0b000000”,“0b000000” 输出为:“0b000000” 如果输入为:“0b10101010”,“0b11111111” 输出为:“0b10101010” 如果输入为:“0b10”、“0b11111111” 输出为:“0b10” 如果输入为:“0b10101110”,“0b101” 输出为:“0b100” 这是我的密码: string binaryAND(const string &number1, const string &number2
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;
}
}
字符串二进制和(常量字符串和数字1,常量字符串和数字2){
第一个字符串_sol=“”;
字符串sol=“0b”;
如果(number1.length()-1){
first_sol=to_字符串(sol_int%2)+first_sol;
sol_int/=2;
我--;
}
溶胶+=第一溶胶;
返回溶胶;
}
如果(number1.length()>=number2.length()){
字符串编号11=“”;
字符串编号22=“”;
对于(int i=2;i-1){
first_sol=to_字符串(sol_int%2)+first_sol;
sol_int/=2;
我--;
}
溶胶+=第一溶胶;
返回溶胶;
}
}
编辑:
但它不起作用。“0b”后面的输出比应有的多了一个0
例如,输出应该是:“0b000000”
但它是:“0b0000000”
应该是:“0b10101010”
但它是:“0b010101010”
应该是:“0b100”
但它是:“0b0100”
我不知道如何更正代码。有什么想法吗?你有一个没有效果的表达:
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'];
});
因此,除了@DietmarKuhl的好答案之外,请注意他试图教给你的“教训”:只要使用标准库算法,你就可以实现很多功能,比如
std::transform
——因此花一些时间研究它们很重要
此外,即使您只是想实现自己的解决方案,您也有几个循环,它们实际上与调用std::copy_n()
完全相同;等等
最后-一个稍有不同的短期解决方案,IMHO更好地遵循:
sol+first\u sol代码>不会更改sol
。你的意思是sol+=first\u sol代码>?@JohnKugelmansupportsMonica哦,是的!你是对的!我没有看到那个错误。非常感谢。但现在的输出仍然有点不同,它应该是。我要编辑这篇文章。因为“0”=0x30,“1”=0x31,所以可以对字符应用真正的二进制和(&),比如:[](字符a,字符b){return a&b;}@jenkas:这可能行得通,但人们不容易想到。此外,如果有人将此代码改编为其他字符集,则情况将不再如此,改编者可能会忽略这一事实。现在,如果您想最大限度地提高性能,确实可以这样做,但是,您不会使用std::string
结果;一次可以处理多个字符,等等。
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'; }
);