Добавление двоичных чисел в переполнение стека

Как бы я добавил два двоичных числа в 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");
}

8

Решение

Ну, это довольно тривиальная проблема.

Как добавить два двоичных числа в c ++. какова логика этого.

Для добавления двух двоичных чисел, a и b. Вы можете использовать следующие уравнения для этого.

сумма = х или б

нести = ab

Это уравнение для Полумесяц.

Теперь, чтобы реализовать это, вам может понадобиться понять, как Полный сумматор работает.

сумма = а х или б хор с

нести = ab + bc + ca

Поскольку вы храните ваши двоичные числа в массиве int, вы можете захотеть понять, побитовая операция.
Вы можете использовать ^ для XOR, | оператор для OR, & оператор для AND.

Вот пример кода для расчета суммы.

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

Другие решения

Поскольку вы спрашивали о C ++, вы заслуживаете ответа C ++. использование bitsets:

#include <bitset>
#include <iostream>

int main() {
std::bitset<5> const a("1001");
std::bitset<5> const b("1111");
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;
}

Это работает для произвольно длинных битовых наборов.

4

Есть ошибка:

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

Также вы можете печатать в обратном порядке

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

Вы можете использовать операцию «Побитовое ИЛИ» для уменьшения кода, так как

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

Ваши массивы — это один элемент, который слишком мал для вашей индексации.

int a[3] только 3 элемента, так a[3] = 1 недействителен (имеет неопределенное поведение) так как он обращается к 4-му элементу, который не существует.
Аналогично для других массивов.

Это означает, что вся программа имеет неопределенное поведение, то есть она может делать что угодно или вообще ничего.

(В вашем случае, вероятно, происходит то, что запись вне массивов перезаписывает другие переменные.)

Вы также не инициализируете result массив, поэтому его содержимое — это просто случайные данные.
Поскольку вы обновляете только 4 его элемента, но печатаете все (и более), выходные данные также будут случайными.

1

Ниже приведены ошибки в вашем коде и исправленный код также ниже «

  1. int a [] был размером 3, поэтому он не может храниться в третьем индексе. используйте int [4].
  2. если (a [i] + b [i] + carry == 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;
}
1
#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;

}
1

Неоднократно делать

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

пока х не будет 0. у ответ.

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector