Добавление 10-разрядных двоичных чисел

#c #binary

Вопрос:

Мне нужно 2 строки (10-битные двоичные числа). Мне легко, когда я добавляю 1 0 0 0 Но как я могу изменить это, чтобы ситуация, когда мне нужно будет сделать 11-битный, например 1010101010 1111111111 = 11010101001

 i = MAX 1;
    while( i!=0) {
        if ((str1[i - 1] == str2[i - 1]) amp;amp; (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]) amp;amp; (str1[i - 1] == '1')) {
            str3[i] = '0';
        }
        i--;
    }
 

MAX = 10

Комментарии:

1. Реализация сложения в двоичных строках довольно странная. Было бы приемлемо предоставить ответ, который включает преобразование этих строк в целые числа? Как бы выглядел хороший ответ для вас?

2. Нет, я не могу использовать преобразование

3. Похоже, вы не используете перенос. Например: 11 11 = 110. Или, может быть, я этого не вижу.

4. 1 1 = 0, с переносом 1. На самом деле, перенос тоже должен быть добавлен. Сравните каждую из 3 переменных с 1 и просуммируйте ее. Точно так же, как добавление десятичных чисел

Ответ №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 amp; 1);
    carry >>= 1;
  }
}

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

  binary_string_add(str1, str2, str3);
  printf("Sum: %sn", str3);
}
 

Кстати, каждая итерация цикла фактически реализует 1-битный сумматор.

Обновление: если вам нужен более простой интерфейс, который выделяет для вас выходную строку соответствующей длины и возвращает ее, это работает:

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

Комментарии:

1. Не к добру. Представьте, что вы не знаете, какой длины операнды, и вам нужно создать «xxxxxxxxxx» соответствующей длины

2. Похоже, что Anchr явно хочет добавить два 10-разрядных числа и получить 11-разрядный результат. Если это не так, Anchr должен уточнить, каковы требования. В любом случае, я предоставил гораздо более общую вещь, которая может работать с входными и выходными строками любой длины, и вы могли бы легко добавить оболочку вокруг нее, которая выделяет память для новой выходной строки с нужной длиной или что-то в этом роде, если это то, что вам нужно.

3. В любом случае — вычислите конец буфера в функции. Функция также должна возвращать что-то. Например, для использования в качестве параметра других функций.

Ответ №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 amp; 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 ;
    }
}
 

Комментарии:

1. Хм. Похоже, вы предприняли искреннюю попытку внести свой вклад в ответ, который ценится. Но это также выглядит так, как будто вы немного неаккуратно отнеслись к своему форматированию. Можете ли вы просмотреть свой ответ и исправить форматирование? В нынешнем виде это будет иметь лишь ограниченное применение для читателей. Пока вы этим занимаетесь, пожалуйста, не забудьте включить объяснение.