#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. Хм. Похоже, вы предприняли искреннюю попытку внести свой вклад в ответ, который ценится. Но это также выглядит так, как будто вы немного неаккуратно отнеслись к своему форматированию. Можете ли вы просмотреть свой ответ и исправить форматирование? В нынешнем виде это будет иметь лишь ограниченное применение для читателей. Пока вы этим занимаетесь, пожалуйста, не забудьте включить объяснение.