it-roy-ru.com

Добавление двоичных чисел в C++

Как бы я добавил два двоичных числа в 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
Muhammad Arslan Jamshaid

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

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

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

сумма = х или б

нести = ab

Это уравнение для Half Adder .

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

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

нести = ab + bc + ca

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

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

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
krammer

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

#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
bitmask

Есть ошибка:

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

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

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

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

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
dreamcrash

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

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

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

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

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

1
molbdnilo
#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
Manglesh Pareek

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

  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
Aadil Imran

Что делать, если их размеры не совпадают? Кроме того, вы хотели бы позволить пользователю вводить двоичные числа (в данном случае представляющие целые числа) как целые числа, а не как элементы массивов. Вот кусок кода, который выполняет эти :-)

#include <iostream>
using namespace std; 

// Add two numbers in binary

void sumBinary(int num1, int num2, int* sum12){
    int mod1 = 0;
    int mod2 = 0;
    int carry = 0;
    int factor = 1;

    int flag = 0;

    *sum12 = 0;

    while (!flag){
        mod1 = num1 % 10;
        mod2 = num2 % 10;

        num1 /= 10;
        num2 /= 10;
        if ((carry + mod1 + mod2) == 2){
            *sum12 += 0;
            carry = 1;
        }
        else if ((carry + mod1 + mod2) == 3){
            *sum12 += factor;
            carry = 1;
        }
        else if ((carry + mod1 + mod2) == 0){
            *sum12 += 0;
            carry = 0;
        }
        else{
            *sum12 += factor;
            carry = 0;
        }
        factor *= 10;
        if ((num1 == 0) && (num2 == 0)){ 
            *sum12 += carry*factor;
            flag = 1; }


    }
}
void main(){
    int num1, num2, sum12;

    cout << "Enter the first binary integer number: ";
    cin >> num1;
    cout << "Enter the second binary integer number: ";
    cin >> num2;

    sumBinary(num1, num2, &sum12);

    cout << "The sum in binary form is :" << sum12 << endl;
}
0
Mattlab

Простой способ: 

    int getBit(string s, int index)
    {
         if(index >= 0)   return (s[index] - '0');
         else             return 0;
    }

    string addBinary(string a, string b) 
    {
        if(a.size() > b.size())        while(a.size() > b.size()) b = "0" + b;
        else if(b.size() > a.size())   while(b.size() > a.size()) a = "0" + a;

        int l = max(a.size()-1, b.size() - 1);

        string result = ""; 
        int s=0;        

        while(l>=0 || s==1)
        {
            s += getBit(a, l) + getBit(b, l) ;
            result = char(s % 2 + '0') + result;
            s /= 2;
            l--;
        }
        return result;
    }
0
rashedcs

Нетрадиционное решение, но оно работает:

int main() {

  int A[] = { 0, 0, 0, 1, 1, 0, 1, 0};
  int B[] = { 0, 0, 0, 0, 1, 1, 0, 0};

  int size = sizeof(A)/sizeof(*A);

  int C[size+1];
  int t = 0;

  for(int i = size-1; i > -1; i--){

      C[i+1] = A[i]+B[i]+t;
      t = C[i+1]/2;
      C[i+1] %= 2;
  }

  C[0] = t;
}
0
fedemengo

ты должен сделать это 

for(int i = 3; i >= 0; i--)
    {
        if(a[i] + b[i] + carry == 0)
        {
            result[i] = 0;
            carry = 0;
        }
        else if(a[i]+b[i]+carry==1)
        {
            result[i]=1;
            carry=0;  
        }
        else if(a[i] + b[i] + carry == 2)
        {
            result[i] = 0;
            carry = 1;
        }
        else if(a[i] + b[i] + carry > 2)
        {
            result[i] = 1;
            carry = 1;
        }
        printf("%d",result[i]);
    }
0
bingchuan zhang

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

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

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

0
user515430
int main(){
     ios::sync_with_stdio(0); cin.tie(0);

     int num1=12, num2=45, sum=0;
     bool b1, b2, carry=0;


     for(int i=0;i<32;i++){

        b1=( 1<<i ) & num1;
        b2=( 1<<i ) & num2;

        sum = (b1 ^ b2 ^ carry) ? sum ^ (1<<i) : sum; 

        carry = ((b1 & b2) | (b1 & carry) | (b2 & carry));

     }

    cout<<sum;

    return 0;
}
0
Munny Kumar