Как бы я добавил два двоичных числа в 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");
}
Ну, это довольно тривиальная проблема.
Как добавить два двоичных числа в 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);
}
Поскольку вы спрашивали о 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;
}
Это работает для произвольно длинных битовых наборов.
Есть ошибка:
if(a[i]+b[i]+carry==1)
{
result[i]=1;
carry=0;
}
Также вы можете печатать в обратном порядке
for(int j=6; j>=0; j--)
{
cout<<result[j]<<" ";
}
Вы можете использовать операцию «Побитовое ИЛИ» для уменьшения кода, так как
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;
}
Ваши массивы — это один элемент, который слишком мал для вашей индексации.
int a[3]
только 3 элемента, так a[3] = 1
недействителен (имеет неопределенное поведение) так как он обращается к 4-му элементу, который не существует.
Аналогично для других массивов.
Это означает, что вся программа имеет неопределенное поведение, то есть она может делать что угодно или вообще ничего.
(В вашем случае, вероятно, происходит то, что запись вне массивов перезаписывает другие переменные.)
Вы также не инициализируете result
массив, поэтому его содержимое — это просто случайные данные.
Поскольку вы обновляете только 4 его элемента, но печатаете все (и более), выходные данные также будут случайными.
Ниже приведены ошибки в вашем коде и исправленный код также ниже «
вот рабочая часть кода:
#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;
}
#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;
}
Неоднократно делать
(x, y) <- ((x & y) << 1, x ^ y)
пока х не будет 0. у ответ.