2012-11-08 316 views
8

如何在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"); 
} 
+0

@dupersuper這地獄:P我沒有得到 –

+1

我想你不生活在英語講國家。這是一個成語:http://www.thefreedictionary.com/for+the+hell+of+it – dupersuper

+0

它在哪裏出錯? – krammer

回答

19

嗯,這是一個很瑣碎的問題。

如何在C++中添加兩個二進制數字。它的邏輯是什麼。

要添加兩個二進制數,a和b。你可以使用下面的公式來做到這一點。

總和=一個XOR B

進位= AB

這是一個Half Adder方程。

現在要實現這一點,您可能需要了解Full Adder的工作原理。

總和=一個XOR B XOR c ^​​

隨身= AB + BC + CA

既然您存儲二進制數的int數組,你可能想了解bitwise operation。 您可以使用^作爲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); 
} 
2

有一個錯誤:

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

而且ü可能想在反向

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

沒關係,但其他代碼呢? –

+0

btw的用途是什麼?它可能會更容易轉換爲十進制 - >添加 - >轉換爲二進制, –

+0

是的,它可能是,但什麼是將二進制轉換爲十進制的算法? –

1

您可以使用「按位或」操作來減少代碼,因爲

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

反覆做

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

直到x爲0,y是答案。

3

既然你問的是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; 
} 

這適用於任意長的位集。

+0

米代表什麼? –

+1

@Xploit:'m'是一個掩碼來提取一個bitset的LSB。例如,'(「uvwxyz」>> 2)&「1」' - >'「x」'。 – bitmask

1

您的陣列對於索引來說太小了。

int a[3]只有3個元素,所以a[3] = 1無效(它有未定義的行爲),因爲它的訪問第四元件,其不存在。
對於其他陣列也是如此。

這意味着整個程序具有未定義的行爲,即它可以做任何事情或根本不做任何事情。

(什麼是你的情況很可能發生的事情是寫陣列外部覆蓋其他變量。)

你還沒有初始化的result陣列,因此它的內容只是一些隨機數據。
由於您只更新了其中的4個元素,但打印了所有元素(以及更多),輸出也是隨機數據。

1

繼在你的代碼中的錯誤和固定碼也低於」

  1. INT A []是大小爲3,因此它不能在第三索引處存放。使用int A [4]。
  2. 如果(a [i] + b [i] + carry == 1)在此檢查更新結果[i] = 1; carry = 0中分配了錯誤的值
  3. 檢查的順序相反
  4. 最後一個進位沒有存儲在結果中
  5. 存儲在結果ar中的相加結果ray的順序是相反的,所以反向打印。

這裏是代碼的工作件:

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

} 
0

你應該這樣做

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

非傳統的解決方案,但它的工作原理:

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

Wha如果他們的大小不一樣?另外,您希望允許用戶將二進制數(在本例中表示整數)輸入爲整數,而不是數組的元素。下面是一段代碼,實現這些:-)

#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

一個簡單的方法:

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