【问题标题】:Adding 10-bit binary numbers添加 10 位二进制数
【发布时间】:2022-01-04 21:53:42
【问题描述】:

我需要 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--;
    }

MAX=10

【问题讨论】:

  • 在二进制字符串上实现加法有点奇怪。提供涉及将这些字符串转换为整数的答案是否可以接受?对你来说,一个好的答案是什么样的?
  • 不,我不能使用转换
  • 您似乎没有使用结转。例如:11 + 11 = 110。或者我没有看到它。
  • 1+1=0,进位为1。实际上也必须加进位。将 3 个变量中的每一个与 1 进行比较,然后求和。就像添加十进制数一样

标签: c binary


【解决方案1】:

不清楚确切的要求是什么,但我写了一个函数,它接受三个字符串,使用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

更新:如果您想要一个更简单的界面,为您分配适当长度的输出字符串并返回它,这可行:

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

【讨论】:

  • 不好。想象一下,你不知道操作数有多长,你需要创建适当长度的“xxxxxxxxxx”
  • 听起来 Anchr 明确想要添加两个 10 位数字并获得 11 位结果。如果不是这样,Anchr 应该明确要求是什么。无论如何,我提供了一个更通用的东西,它可以处理任何长度的输入和输出字符串,你可以轻松地在它周围添加一个包装器,为具有正确长度的新输出字符串分配内存,或者如果你需要的话。
  • Anyway - 计算函数中缓冲区的结尾。函数也应该返回一些东西。例如用作其他函数的参数。
【解决方案2】:
#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;
}

【讨论】:

    【解决方案3】:
    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 ;
        }
    }
    

    【讨论】:

    • 嗯。看起来您已经真诚地尝试提供答案,对此表示赞赏。但看起来你的格式有点草率。您可以查看您的答案并清理您的格式吗?就目前而言,这仅对读者有用。在您进行此操作时,请务必附上解释。
    猜你喜欢
    • 1970-01-01
    • 2012-01-22
    • 2020-01-28
    • 2014-09-26
    • 1970-01-01
    • 2022-01-15
    • 2012-02-28
    • 2017-03-14
    • 1970-01-01
    相关资源
    最近更新 更多