和两个二进制字符串 我必须在C++中编写一个函数,其中输入是2个二进制字符串,输出必须是一个字符串,它是两个输入的字符串的位。此外,输出必须具有两个输入中较短的长度

和两个二进制字符串 我必须在C++中编写一个函数,其中输入是2个二进制字符串,输出必须是一个字符串,它是两个输入的字符串的位。此外,输出必须具有两个输入中较短的长度,c++,C++,比如说 如果输入为:“0b000000”,“0b000000” 输出为:“0b000000” 如果输入为:“0b10101010”,“0b11111111” 输出为:“0b10101010” 如果输入为:“0b10”、“0b11111111” 输出为:“0b10” 如果输入为:“0b10101110”,“0b101” 输出为:“0b100” 这是我的密码: string binaryAND(const string &number1, const string &number2

比如说 如果输入为:“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;
    }
}



字符串二进制和(常量字符串和数字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'; }
);