【问题标题】:Adding binary numbers in C++在 C++ 中添加二进制数
【发布时间】:2012-11-08 05:12:29
【问题描述】:

如何在 C++ 中添加两个二进制数?正确的逻辑是什么?

这是我的努力,但似乎不正确:

#include <iostream>
using namespace std;
int main()
{
    int a[3];
    int b[3];
    int carry = 0;
    int result[7];

    a[0] = 1;
    a[1] = 0;
    a[2] = 0;
    a[3] = 1;

    b[0] = 1;
    b[1] = 1;
    b[2] = 1;
    b[3] = 1;

    for(int i = 0; i <= 3; i++)
    {
        if(a[i] + b[i] + carry == 0)
        {
            result[i] = 0;
            carry = 0;
        }

        if(a[i] + b[i] + carry == 1)
        {
            result[i] = 0;
            carry = 0;
        }

        if(a[i] + b[i] + carry == 2)
        {
            result[i] = 0;
            carry = 1;
        }

        if(a[i] + b[i] + carry > 2)
        {
            result[i] = 1;
            carry = 1;
        }
    }
    for(int j = 0; j <= 7; j++)
    {
        cout<<result[j]<<" ";
    }
    system("pause");
}

【问题讨论】:

    标签: c++ binary add


    【解决方案1】:

    嗯,这是一个非常微不足道的问题。

    如何在 C++ 中添加两个二进制数。它的逻辑是什么。

    用于添加两个二进制数,a 和 b。您可以使用以下等式来执行此操作。

    sum = a xor b

    carry = ab

    这是Half Adder 的等式。

    现在要实现这一点,您可能需要了解 Full Adder 的工作原理。

    sum = a xor b xor c

    进位 = ab+bc+ca

    由于您将二进制数存储在 int 数组中,您可能想了解bitwise operation。 您可以使用 ^ 进行异或,| OR 运算符,AND 运算符。

    这是一个计算总和的示例代码。

    for(i = 0; i < 8 ; i++){
       sum[i] = ((a[i] ^ b[i]) ^ c); // c is carry
       c = ((a[i] & b[i]) | (a[i] & c)) | (b[i] & c); 
    }
    

    【讨论】:

      【解决方案2】:

      既然您问的是 C++,那么您应该得到 C++ 的答案。使用bitsets

      #include <bitset>
      #include <iostream>
      
      int main() {
        std::bitset<5> const a("1001");
        std::bitset<5> const b("1111");
        // m here is a mask to extract the lsb of a bitset.
        std::bitset<5> const m("1");
        std::bitset<5> result;
        for (auto i = 0; i < result.size(); ++i) {
          std::bitset<5> const diff(((a >> i)&m).to_ullong() + ((b >> i)&m).to_ullong() + (result >> i).to_ullong());
          result ^= (diff ^ (result >> i)) << i;
        }
        std::cout << result << std::endl;
      }
      

      这适用于任意长的位集。

      【讨论】:

      • m代表什么?
      • @Xploit:m 是提取位集 lsb 的掩码。例如,("uvwxyz" &gt;&gt; 2)&amp;"1" -> "x"
      • diff 是什么?
      【解决方案3】:

      你可以使用“按位或”运算来减少代码,因为

      1 or 1 = 1
      1 or 0 = 1
      0 or 1 = 1
      0 or 0 = 0
      

      您还可以将这两个数字转换为十进制和,然后它们再次返回二进制。

      十进制转二进制

      int toBinary (unsigned int num, char b[32])
          {
          unsigned  int x = INT_MIN;      // (32bits)
          int i = 0, count = 0;
          while (x != 0)
          {
            if(x & num) // If the actual o bit is 1 & 1 = 1 otherwise = 0
            {
                b[i] = '1';
                count++;
            }
            else b[i] = '0';
      
            x >>=1;       // pass to the left
            i++;          
          }
          return count;
          }
      

      【讨论】:

        【解决方案4】:

        有一个错误:

        if(a[i]+b[i]+carry==1)  
        {   
        result[i]=1; 
        carry=0;  
        }  
        

        你也可能想反向打印

        for(int j=6; j>=0; j--)  
        {  
           cout<<result[j]<<" ";  
        }
        

        【讨论】:

        • 顺便说一句,目的是什么?转换为十进制可能更容易 -> 添加 -> 转换为二进制,
        • 是的,它可能是,但是将二进制转换为十进制的算法是什么?
        • @Programer 位置 n 处的二进制位 b,其中最右边的位具有位置 1,其十进制值为 b*2^(n-1)。尝试将此逻辑应用于一些小的二进制数。例如,尝试使用它将数字 1011 和 110 转换为十进制。你应该分别得到 11 和 6。
        • @Programer 用于将二进制转换为十进制,您可能需要遵循:wikihow.com/Convert-from-Binary-to-Decimal.
        【解决方案5】:

        您的数组对于您的索引来说太小了。

        int a[3] 只有 3 个元素,因此 a[3] = 1 无效(它具有未定义的行为),因为它正在访问不存在的第 4 个元素。
        其他数组也是如此。

        这意味着整个程序具有未定义的行为,即它可以做任何事情或什么都不做。

        (在您的情况下可能发生的情况是在数组外部写入会覆盖其他变量。)

        您也没有初始化 result 数组,因此它的内容只是一些随机数据。
        由于您只更新了其中的 4 个元素但打印了所有元素(以及更多),因此输出也将是随机数据。

        【讨论】:

          【解决方案6】:

          以下是您的代码中的错误,固定代码也在下面“

          1. int a[] 的大小为 3,因此它不能存储在第三个索引处。使用 int a[4]。
          2. if(a[i]+b[i]+carry==1) 在此检查更新结果[i]=1 中分配了错误的值;携带=0。
          3. 检查顺序相反。
          4. 最后一个进位未存储在结果中。
          5. 存储在结果数组中的加法结果是倒序的,所以要倒序打印。

          这是工作代码:

          #include <iostream>
          #include <string>
          using namespace std;
          
          int main()
          {
              int a[4];
              int b[4];
              int carry=0;
              int result[5];
          
          
              a[0]=1;
              a[1]=0;
              a[2]=0;
              a[3]=1;
          
              b[0]=1;
              b[1]=1;
              b[2]=1;
              b[3]=1;
          
              for(int i=0; i<4; i++)
              {
          
                  if(a[i]+b[i]+carry==3)
                  {
                  result[i]=1;
                  carry=1;
                  }
                  if(a[i]+b[i]+carry==2)
                  {
                  result[i]=0;
                  carry=1;
                  }
                  if(a[i]+b[i]+carry==1)
                  {
                  result[i]=1;
                  carry=0;
                  }
                  if(a[i]+b[i]+carry==0)
                  {
                  result[i]=0;
                  carry=0;
                  }
          
          
              }
              result[4]=carry;
              for(int j=4; j>=0; j--)
              {
                  cout<<result[j];
          
              }
              cout<<endl;
          
                  return 0;
          }
          

          【讨论】:

            【解决方案7】:
            #include <stdio.h>
            
            
            
            int main()
            
            {
            
            
            
                long binary1, binary2;
            
                int i = 0, remainder = 0, sum[20];
            
            
            
                printf("Enter the first binary number: ");
            
                scanf("%ld", &binary1);
            
                printf("Enter the second binary number: ");
            
                scanf("%ld", &binary2);
            
                while (binary1 != 0 || binary2 != 0)
            
                {
            
                    sum[i++] =(binary1 % 10 + binary2 % 10 + remainder) % 2;
            
                    remainder =(binary1 % 10 + binary2 % 10 + remainder) / 2;
            
                    binary1 = binary1 / 10;
            
                    binary2 = binary2 / 10;
            
                }
            
                if (remainder != 0)
            
                    sum[i++] = remainder;
            
                --i;
            
                printf("Sum of two binary numbers: ");
            
                while (i >= 0)
            
                    printf("%d", sum[i--]);
            
                getch();
                return 0;
            
            }
            

            【讨论】:

              【解决方案8】:

              反复做

              (x, y) <- ((x & y) << 1, x ^ y)
              

              直到 x 为 0。y 就是答案。

              【讨论】:

                【解决方案9】:

                你应该这样做

                for(int i = 3; i >= 0; i--)
                    {
                        if(a[i] + b[i] + carry == 0)
                        {
                            result[i] = 0;
                            carry = 0;
                        }
                        else if(a[i]+b[i]+carry==1)
                        {
                            result[i]=1;
                            carry=0;  
                        }
                        else if(a[i] + b[i] + carry == 2)
                        {
                            result[i] = 0;
                            carry = 1;
                        }
                        else if(a[i] + b[i] + carry > 2)
                        {
                            result[i] = 1;
                            carry = 1;
                        }
                        printf("%d",result[i]);
                    }
                

                【讨论】:

                  【解决方案10】:

                  一个非常规的解决方案,但它有效:

                  int main() {
                  
                    int A[] = { 0, 0, 0, 1, 1, 0, 1, 0};
                    int B[] = { 0, 0, 0, 0, 1, 1, 0, 0};
                  
                    int size = sizeof(A)/sizeof(*A);
                  
                    int C[size+1];
                    int t = 0;
                  
                    for(int i = size-1; i > -1; i--){
                  
                        C[i+1] = A[i]+B[i]+t;
                        t = C[i+1]/2;
                        C[i+1] %= 2;
                    }
                  
                    C[0] = t;
                  }
                  

                  【讨论】:

                    【解决方案11】:

                    如果它们的尺寸不同怎么办?此外,您可能希望允许用户输入二进制数(在这种情况下表示整数)作为整数而不是数组元素。这是完成这些的一段代码:-)

                    #include <iostream>
                    using namespace std; 
                    
                    // Add two numbers in binary
                    
                    void sumBinary(int num1, int num2, int* sum12){
                        int mod1 = 0;
                        int mod2 = 0;
                        int carry = 0;
                        int factor = 1;
                    
                        int flag = 0;
                    
                        *sum12 = 0;
                    
                        while (!flag){
                            mod1 = num1 % 10;
                            mod2 = num2 % 10;
                    
                            num1 /= 10;
                            num2 /= 10;
                            if ((carry + mod1 + mod2) == 2){
                                *sum12 += 0;
                                carry = 1;
                            }
                            else if ((carry + mod1 + mod2) == 3){
                                *sum12 += factor;
                                carry = 1;
                            }
                            else if ((carry + mod1 + mod2) == 0){
                                *sum12 += 0;
                                carry = 0;
                            }
                            else{
                                *sum12 += factor;
                                carry = 0;
                            }
                            factor *= 10;
                            if ((num1 == 0) && (num2 == 0)){ 
                                *sum12 += carry*factor;
                                flag = 1; }
                    
                    
                        }
                    }
                    void main(){
                        int num1, num2, sum12;
                    
                        cout << "Enter the first binary integer number: ";
                        cin >> num1;
                        cout << "Enter the second binary integer number: ";
                        cin >> num2;
                    
                        sumBinary(num1, num2, &sum12);
                    
                        cout << "The sum in binary form is :" << sum12 << endl;
                    }
                    

                    【讨论】:

                      【解决方案12】:

                      一个简单的方法:

                          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;
                          }
                      

                      【讨论】:

                        【解决方案13】:
                        int main(){
                             ios::sync_with_stdio(0); cin.tie(0);
                        
                             int num1=12, num2=45, sum=0;
                             bool b1, b2, carry=0;
                        
                        
                             for(int i=0;i<32;i++){
                        
                                b1=( 1<<i ) & num1;
                                b2=( 1<<i ) & num2;
                        
                                sum = (b1 ^ b2 ^ carry) ? sum ^ (1<<i) : sum; 
                        
                                carry = ((b1 & b2) | (b1 & carry) | (b2 & carry));
                        
                             }
                        
                            cout<<sum;
                        
                            return 0;
                        }
                        

                        【讨论】:

                          猜你喜欢
                          • 2021-07-09
                          • 1970-01-01
                          • 2015-02-01
                          • 2012-01-22
                          • 2018-06-29
                          • 2014-09-26
                          • 1970-01-01
                          • 2022-01-15
                          • 2017-03-14
                          相关资源
                          最近更新 更多