【问题标题】:Adding 2 binary numbers as string, C++添加2个二进制数作为字符串,C++
【发布时间】:2015-03-05 19:08:17
【问题描述】:

我在添加 2 个二进制数时遇到问题。我想把它作为一个字符串来做,所以如果它们的长度不同,我将 '0' 连接到较短字符串的开头。首先,我不知道为什么,但我需要添加“0”(没有它,它根本不起作用)。

#include <iostream>
using namespace std;


string add( string no1, string no2 );


int equalizer(string no1, string no2)
{
int len1 = no1.length();
int len2 = no2.length();
if (len1 < len2)
{
    for (int i = 0 ; i < len2 - len1 ; i++)
    {

        no1 = '0' + no1;
    }
    return len2;
 }
 else if (len1 >= len2)
 {
    for (int i = 0 ; i < len1 - len2 ; i++)
    {

        no2 = '0' + no2;
    }
    return len1; // If len1 >= len2
 }

 }


 string add( string no1, string no2 )
 {
  string result="";


  int length = equalizer(no1, no2);

 int carry = 0;


 for (int i = length-1 ; i >= 0 ; i--)
 {
    int bit1 = no1.at(i) - '0';
    int bit2 = no2.at(i) - '0';

    // boolean expression for sum of 3 bits
    int sum = (bit1 ^ bit2 ^ carry)+'0';

    result = (char)sum + result;

    // boolean expression for 3-bit addition
    carry = (bit1 & bit2) | (bit2 & carry) | (bit1 & carry);
  } 

  // if overflow, then add a leading 1
  if (carry)
 {


    result = '1' + result;
  }

  return result;
  }
 bool check(string no1)
 {
 for(int i =0; i<no1.length(); i++)
 {
    if(no1.at(i)!=0 || no1.at(i)!=1)
    {
        cout << "not biniary! should contain only '0' and '1' "<< endl;
        return false;
    }
    else
    {
        return true;
    }
   }
  }
 int main()
 {
 string no1;
 string no2;
 cout << "Welcome to program that add 2 biniary numbers!" << endl;
 cout <<"Give first number " <<endl;
 cin >> no1;
 if(check(no1)==true)
 {





    cout <<"Give 2nd number" << endl;
    cin >> no2;
    check(no2);
    cout << "Numbers are proper!" << endl;
    add(no1,no2);
 }
 else
 {
    cout <<"End of program."<<endl;
 }
 return 0;
 }

【问题讨论】:

    标签: c++ numbers add


    【解决方案1】:

    我将在开头反转字符串:std::reverse(s1.begin(), s1.end()),而不是添加尾随零。然后我会从开头添加每个数字。 res[i] = s1[i] - s2[i] + '0'; 记得初始化 res 字符串然后再反转回来!祝你好运!

    【讨论】:

    • 我做了一点改动,现在我已经解决了添加二进制数的问题,但是我遇到了预期问题。 pastebin.com/PGLKRAS8 TBH 我不知道期望有什么问题。我知道我对他们知之甚少,但我不明白为什么,例如2 抛出期望,但 123 没有?
    • 尝试使用gdb --args ./yourexecname 然后输入run 访问回溯类型bt当然要调试需要添加编译器选项-g -O0祝你好运!
    【解决方案2】:

    用这个方法在开头加0:-

    考虑到您的 str1 超出范围而 str2 仍然存在,并且您想在 str2 之前添加 str1

    char *temp = strdup(str2);
    strcpy(str2, str1); 
    strcat(str2, temp);  
    free(temp);
    

    【讨论】:

      【解决方案3】:

      我认为下面的代码会有所帮助。

              int getBit(string s, int index)
              {
                   if(index >= 0)   return (s[index] - '0');
                   else             return 0;
              }
      
              string addBinary(string a, string b) 
              {
                  if(a.size() > b.size())        while(a.size() > b.size()) b = "0" + b;
                  else if(b.size() > a.size())   while(b.size() > a.size()) a = "0" + a;
      
      
                  int l = max(a.size()-1, b.size() - 1);
      
                  string result = ""; 
                  int s=0;        
      
                  while(l>=0 || s==1)
                  {
                      s += getBit(a, l) + getBit(b, l) ;
                      result = char(s % 2 + '0') + result;
                      s /= 2;
                      l--;
                  }
                  return result;
              }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-27
        • 1970-01-01
        • 1970-01-01
        • 2017-03-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多