添加 10 位二进制数

Adding 10-bit binary numbers

我需要 2 个字符串(10 位二进制数)。当我添加 1+0 0+0 时我很容易 但是我该如何修改它,以适应我需要制作 11 位的情况 像 1010101010+1111111111=11010101001

i = MAX+1;
    while( i!=0) {
        if ((str1[i - 1] == str2[i - 1]) && (str1[i - 1] == '0' )) {
            str3[i] = '0';
        }
        else if ((str1[i - 1] != str2[i - 1])) {
            str3[i] = '1';
        }
        else if ((str1[i - 1] == str2[i - 1]) && (str1[i - 1] == '1')) {
            str3[i] = '0';
        }
        i--;
    }

最大=10

不清楚确切的要求是什么,但我编写了一个函数,它接受三个字符串,使用 strlen 计算出它们的长度,然后将第三个字符串设置为等于前两个字符串的总和。这是一个将您提供的两个 10 位数字相加并打印“11010101001”的预期结果的程序。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void binary_string_add(const char * a, const char * b, char * sum)
{
  size_t alen = strlen(a);
  size_t blen = strlen(b);
  size_t sumlen = strlen(sum);

  int carry = 0;
  for (size_t i = 0; i < sumlen; i++)
  {
    if (i < alen) { carry += a[alen - 1 - i] == '1'; }
    if (i < blen) { carry += b[blen - 1 - i] == '1'; }
    sum[sumlen - 1 - i] = '0' + (carry & 1);
    carry >>= 1;
  }
}

int main()
{
  char str1[] = "1010101010";
  char str2[] = "1111111111";
  char str3[] = "xxxxxxxxxxx";

  binary_string_add(str1, str2, str3);
  printf("Sum: %s\n", str3);
}

顺便说一句,循环的每次迭代实际上实现了一个1-bit adder

更新: 如果你想要一个更简单的接口,为你分配一个适当长度的输出字符串 returns,这个可行:

char * binary_string_add2(const char * a, const char * b)
{
  size_t alen = strlen(a);
  size_t blen = strlen(b);
  size_t sumlen = (alen > blen ? alen : blen) + 1;
  char * sum = malloc(sumlen + 1);
  if (sum == NULL) { /** Add error handling here. **/ }
  memset(sum, 'x', sumlen);
  sum[sumlen] = 0;
  binary_string_add(a, b, sum);
  return sum;
}
#define ADDCHAR(c1,c2)  (((c1) == '1') + ((c2) == '1'))

char *add(char *res, const char *n1, const char *n2)
{
    size_t ln1 = strlen(n1);
    size_t ln2 = strlen(n2);
    char *resend = res + (ln2 > ln1 ? ln2 + 2 : ln1 + 2);
    unsigned rem = 0;

    *resend-- = 0;
    while(ln1 || ln2)
    {
        unsigned pres = rem + ADDCHAR(ln1 ? n1[ln1 - 1] : '0', ln2 ? n2[ln2 - 1] : '0');
        *resend-- = '0' + (pres & 1);
        rem = pres >> 1;
        ln1 -= !!ln1;
        ln2 -= !!ln2;
    }
    if(rem) *resend-- = '0' + rem;
    while(resend >= res) *resend-- = ' ';
    return res;
}
int a = 0 ;
       
for(int i = 0 ; i < 10  ; i++){
    str3[i] = str1[i] + str2[i] + a ;
    if(str3[i] > 1){
        str3[i] %= 2 ;
        a = 1 ;
    }
    else{
        a = 0 ;
    }
}