web-dev-qa-db-de.com

Hinzufügen von Binärzahlen in C++

Wie würde ich zwei binäre Zahlen in C++ hinzufügen? Was ist die richtige Logik?

Hier ist meine Anstrengung, aber es scheint nicht richtig zu sein:

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

Nun, es ist ein ziemlich triviales Problem. 

Hinzufügen von zwei Binärzahlen in C++. Was ist die Logik davon?

Zum Hinzufügen von zwei Binärzahlen a und b. Sie können dazu die folgenden Gleichungen verwenden.

sum = a xor b

carry = ab

Dies ist die Gleichung für eine Half Adder .

Um dies zu implementieren, müssen Sie möglicherweise verstehen, wie ein Full Adder funktioniert.

sum = a x oder b x oder c

Übertragen = ab + bc + ca

Da Sie Ihre Binärzahlen in einem int-Feld speichern, möchten Sie vielleicht bitweise Operation . Verstehen. Sie können ^ für XOR, | verwenden Operator für ODER, & Operator für UND.

Hier ist ein Beispielcode zur Berechnung der Summe.

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

Da Sie nach C++ gefragt haben, verdienen Sie eine C++ - Antwort. Verwenden Sie 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;
}

Dies funktioniert für beliebig lange Bitsätze.

4
bitmask

Es gibt einen Fehler:

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

Möglicherweise möchten Sie auch in umgekehrter Richtung drucken 

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

Sie können die Operation "Bitwise OR" verwenden, um den Code seitdem zu reduzieren 

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

Sie können auch beide Zahlen in eine Dezimalsumme umwandeln und wieder zur Binärzahl zurückkehren.

Konvertieren von Dezimal in Binär

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

Ihre Arrays sind ein Element zu klein für Ihre Indizierung. 

int a[3] hat nur 3 Elemente, daher ist a[3] = 1 ungültig (es hat undefined Verhalten ), da er auf das vierte Element zugreift, das nicht existiert.
Ebenso für die anderen Arrays. 

Das bedeutet, dass das gesamte Programm undefiniertes Verhalten aufweist, d. H. Alles oder überhaupt nichts tun kann.

(Wahrscheinlich passiert in Ihrem Fall, dass das Schreiben außerhalb der Arrays die anderen Variablen überschreibt.)

Sie initialisieren auch nicht das result-Array, daher handelt es sich bei dem Inhalt nur um zufällige Daten.
Da Sie nur 4 Elemente aktualisieren, aber alle (und mehr) drucken, werden auch zufällige Daten ausgegeben. 

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

Im Folgenden waren die Fehler in Ihrem Code und der feste Code ist auch unter "

  1. int a [] hatte die Größe 3 und kann daher nicht am 3. Index gespeichert werden. verwende int a [4].
  2. wenn (a [i] + b [i] + carry == 1) in diesem Überprüfungsaktualisierungsergebnis falsche Werte zugewiesen wurden [i] = 1; Übernehmen = 0.
  3. Die Reihenfolge der Prüfungen ist umgekehrt.
  4. Der letzte Übertrag wurde nicht im Ergebnis gespeichert.
  5. Das im Ergebnisfeld gespeicherte Additionsergebnis war in umgekehrter Reihenfolge, also wurde es in umgekehrter Reihenfolge gedruckt.

hier ist das Arbeitsteil des Codes:

#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

Was ist, wenn ihre Größen nicht gleich sind? Außerdem möchten Sie dem Benutzer die Eingabe der Binärzahlen (in diesem Fall für Ganzzahlen) als Ganzzahlen und nicht als Elemente von Arrays ermöglichen. Hier ist ein Stück Code, der diese erfüllt :-)

#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

Ein einfacher Weg: 

    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

Eine nicht konventionelle Lösung, aber es funktioniert:

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

du solltest das tun 

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

Wiederholt tun

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

bis x 0 ist. y ist die Antwort.

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