2012-11-08 39 views
8

Làm cách nào để thêm hai số nhị phân trong C++? Logic chính xác là gì?Thêm số nhị phân vào C++

Đây là nỗ lực của tôi, nhưng nó không có vẻ là đúng:

#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 mà địa ngục: p tôi đã không nhận –

+1

Tôi cho rằng bạn không sống trong một tiếng Anh nói quốc gia. Đó là một thành ngữ: http://www.thefreedictionary.com/for+the+hell+of+it – dupersuper

+0

nó bị sai cho bạn ở đâu? – krammer

Trả lời

19

Vâng, đó là một vấn đề khá tầm thường.

Cách thêm hai số nhị phân vào C++. logic của nó là gì.

Để thêm hai số nhị phân, a và b. Bạn có thể sử dụng các phương trình sau để làm như vậy.

sum = a xor b

carry = ab

Đây là phương trình cho một Half Adder.

Bây giờ để thực hiện việc này, bạn có thể cần phải hiểu cách hoạt động của Full Adder.

sum = a xor b xor c

carry = ab + bc + ca

Vì bạn lưu trữ các số nhị phân của bạn trong mảng int, bạn có thể muốn hiểu bitwise operation. Bạn có thể sử dụng^cho XOR, | toán tử cho OR, & toán tử cho AND.

Đây là mã mẫu để tính tổng.

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

Có một lỗi:

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

Cũng u có thể muốn in ngược

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

không sao, nhưng còn mã khác thì sao? –

+0

mục đích btw là gì? nó có thể được dễ dàng hơn để chuyển đổi sang thập phân -> add -> chuyển đổi sang nhị phân, –

+0

có nó có thể được, nhưng những gì là algo của chuyển đổi nhị phân sang thập phân? –

1

Bạn có thể sử dụng thao tác "Bitwise OR" để giảm mã từ

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

Bạn cũng có thể chuyển đổi cả số thành số thập phân và quay lại nhị phân một lần nữa.

Chuyển đổi số thập phân sang nhị phân

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

Liên tiếp làm

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

cho đến khi x là 0. y là câu trả lời.

3

Vì bạn đã hỏi về C++, bạn xứng đáng được trả lời C++.Sử dụng 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; 
} 

Làm việc cho các bộ bit dài tùy ý.

+0

m đại diện cho những gì? –

+1

@Xploit: 'm' là một mặt nạ để trích xuất lsb của một bitet. Ví dụ: '(" uvwxyz ">> 2) &" 1 "' -> '" x "'. – bitmask

1

mảng của bạn là một trong những item quá nhỏ so với chỉ mục của bạn.

int a[3] chỉ có 3 yếu tố, vì vậy a[3] = 1 là không hợp lệ (nó có hành vi undefined) kể từ khi nó được truy cập vào yếu tố thứ 4, mà không tồn tại.
Tương tự như vậy đối với các mảng khác.

Điều đó có nghĩa rằng toàn bộ chương trình đã không xác định hành vi, tức là nó có thể làm bất cứ điều gì hoặc không có gì cả.

(Có gì lẽ xảy ra trong trường hợp của bạn là viết bên ngoài các mảng được ghi đè lên các biến khác.)

Bạn cũng không initialising mảng result, vì vậy nội dung của nó chỉ là một số dữ liệu ngẫu nhiên.
Vì bạn chỉ cập nhật 4 phần tử của nó nhưng in tất cả chúng (và hơn thế nữa), đầu ra cũng sẽ là dữ liệu ngẫu nhiên.

1

Sau đây là những sai sót trong mã của bạn và mã cố định cũng là bên dưới"

  1. int a [] là chân dung cỡ 3 nên nó không thể lưu trữ tại chỉ số thứ 3. Sử dụng int a [4].
  2. nếu (a [i] + b [i] + mang == 1) giá trị sai đã được ấn định trong kết quả cập nhật kiểm tra này [i] = 1; mang = 0.
  3. Trình tự kiểm tra bị đảo ngược.
  4. Lần mang cuối cùng không được lưu giữ trong kết quả.
  5. Kết quả bổ sung được lưu trữ trong kết quả ar tia theo thứ tự ngược lại để in ngược lại.

đây là mảnh làm việc mã:

#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

bạn nên làm

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

Một giải pháp phi truyền thống này, nhưng nó hoạt động:

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 t nếu kích thước của chúng không giống nhau? Ngoài ra, bạn sẽ muốn cho phép người dùng nhập các số nhị phân (trong trường hợp này biểu diễn các số nguyên) làm các số nguyên chứ không phải là các phần tử của mảng. Dưới đây là một đoạn mã mà hoàn thành những :-)

#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

Một cách đơn giản:

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