在C 中添加二进制数字

Adding binary numbers in C++

本文关键字:二进制数字 添加      更新时间:2023-10-16

如何在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 中添加两个二进制数。它的逻辑是什么。

用于添加两个二进制数字A和b。您可以使用以下方程式进行。

sum = a xor b

carry = ab

这是半加法的方程式。

现在要实施此功能,您可能需要了解完整的加法器的工作原理。

sum = a xor b xor c

crand = ab bc ca

由于您将二进制编号存储在int数组中,因此您可能需要了解位置操作。您可以将 ^用于XOR,|OR,&amp;的操作员和。

的操作员

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

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

由于您询问有关C ,因此您应该得到C 答案。使用块:

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

这适用于任意长的集合。

您可以使用" ditwise或"操作来减少代码,因为

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

有一个错误:

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

您也可能想用反向打印

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

您的数组太小,无法进行索引。

int a[3]只有3个元素,因此a[3] = 1无效(它具有),因为它访问了第四元素,该元素不存在。
同样对于其他阵列。

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

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

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

以下是您的代码中的错误,固定代码也低于"

"
  1. int a []的尺寸为3,因此无法存储在第三索引。使用int a [4]。
  2. 如果(a [i] b [i] crand == 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;
}
#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;
}

反复做

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

直到x为0。y是答案。

您应该这样做

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

一种非规定的解决方案,但起作用:

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

如果它们的大小不一样怎么办?另外,您需要允许用户将二进制数字(在这种情况下代表整数)作为整数,而不是作为数组的元素。这是完成这些的代码: - )

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

一种简单的方法:

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

易于理解的代码
添加两个二进制号(输入数据类型= int)

#include <iostream>
using namespace std;
int power(int a, int b)
{
    int ans = 1;
    while (b)
    {
        ans *= a;
        b--;
    }
    return ans;
}
int main()
{
    int n1, n2, carry = 0, ans = 0, rem1, rem2, remsum = 0, i;
    cout << "Enter First Number : ";
    cin >> n1;
    cout << "Enter Second Number : ";
    cin >> n2;
    for (i = 0; n1 != 0 || n2 != 0; i++, n1 /= 10, n2 /= 10)
    {
        rem1 = n1 % 10;
        rem2 = n2 % 10;
        remsum = rem1 + rem2 + carry;
        if (remsum == 2)
        {
            carry = 1;
            remsum = 0;
        }
        else if (remsum == 3)
        {
            carry = 1;
            remsum = 1;
        }
        else if (remsum == 0)
        {
            carry = 0;
            remsum = 0;
        }
        else if (remsum == 1)
        {
            carry = 0;
            remsum = 1;
        }
        ans = remsum * power(10, i) + ans;
    }
    ans = carry * power(10, i) + ans;
    cout << ans;
    return 0;
}