web-dev-qa-db-fra.com

Ajout de nombres binaires en C++

Comment pourrais-je ajouter deux nombres binaires en C++? Quelle est la bonne logique?

Voici mon effort, mais ça ne semble pas être correct:

#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");
}

Eh bien, c'est un problème assez trivial. 

Comment ajouter deux nombres binaires en c ++. quelle est la logique de celui-ci.

Pour ajouter deux nombres binaires, a et b. Vous pouvez utiliser les équations suivantes pour le faire.

somme = a xor b

porter = ab

C'est l'équation pour un Half Adder .

Maintenant, pour implémenter cela, vous devrez peut-être comprendre comment un Full Adder fonctionne.

somme = a xor b xor c

porter = ab + bc + ca

Puisque vous stockez vos nombres binaires dans un tableau int, vous voudrez peut-être comprendre opération au niveau du bit . Vous pouvez utiliser ^ pour XOR, | opérateur pour OU, et opérateur pour ET.

Voici un exemple de code pour calculer la somme.

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

Puisque vous posiez des questions sur le C++, vous méritez une réponse en C++. Utilisez 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;
}

Cela fonctionne pour des ensembles de bits arbitrairement longs.

4
bitmask

Il y a un bug:

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

Aussi, vous voudrez peut-être imprimer en sens inverse 

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

Vous pouvez utiliser l'opération "OU au niveau du bit" pour réduire le code car 

1 or 1 = 1
1 or 0 = 1
0 or 1 = 1
0 or 0 = 0

Vous pouvez également convertir les deux nombres en somme décimale et les ramener à nouveau en binaire.

Conversion de décimal en binaire

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

Vos tableaux sont un élément trop petit pour votre indexation. 

int a[3] n'a que 3 éléments, donc a[3] = 1 n'est pas valide (il a comportement indéfini ) puisqu'il accède au 4ème élément, qui n'existe pas.
De même pour les autres tableaux. 

Cela signifie que tout le programme a un comportement indéfini, c’est-à-dire qu’il peut tout faire ou rien du tout.

(Ce qui se passe probablement dans votre cas, c'est qu'écrire en dehors des tableaux a pour effet d'écraser les autres variables.)

De plus, vous n'initialisez pas le tableau result. Son contenu est donc constitué de données aléatoires.
Etant donné que vous ne mettez à jour que 4 de ses éléments mais que vous les imprimez tous (et plus), le résultat sera également une donnée aléatoire. 

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

Voici les erreurs dans votre code et le code fixe est également ci-dessous "

  1. int a [] était de taille 3 et ne pouvait donc pas être stocké au 3ème index. utilisez int a [4].
  2. si (a [i] + b [i] + report == 1) des valeurs incorrectes ont été attribuées dans le résultat de la mise à jour du contrôle [i] = 1; porter = 0.
  3. La séquence des vérifications est inversée.
  4. Le dernier report n'a pas été enregistré dans le résultat.
  5. Le résultat de l'addition stocké dans le tableau de résultats était dans l'ordre inverse, donc imprimé à l'envers.

voici le morceau de code de travail:

#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

Et si leurs tailles ne sont pas les mêmes? En outre, vous voudriez permettre à l'utilisateur de saisir les nombres binaires (dans ce cas, représentant des entiers) sous forme d'entiers et non sous forme d'éléments de tableaux. Voici un morceau de code qui accomplit ceux-ci :-)

#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

Un moyen simple: 

    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

Une solution non conventionnelle, mais qui fonctionne:

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

vous devriez faire ceci 

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

Faire à plusieurs reprises

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

jusqu'à ce que x soit égal à 0. y est la réponse.

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