AND两个二进制字符串

时间:2019-12-26 22:19:23

标签: c++

我必须用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”

我不知道如何更正代码。有什么想法吗?

2 个答案:

答案 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'; }
);