Cộng 2 chuỗi số nhị phân có nhớ

Mình đang thắc mắc thuật toán cộng 2 chuỗi số nhị phân có nhớ. Mình có search nhưng đọc chưa hiệu, mọi người giúp mình với.

Đây là thuật toán mình search được

string addBitStrings( string first, string second ) 
{ 
    string result;
    int length = makeEqualLength(first, second); 
    int carry = 0;
    for (int i = length-1 ; i >= 0 ; i--) 
    { 
        int firstBit = first.at(i) - '0'; 
        int secondBit = second.at(i) - '0'; 
        int sum = (firstBit ^ secondBit ^ carry)+'0'; 
        result = (char)sum + result; 
        cout << result <<endl;
        carry = (firstBit&secondBit) | (secondBit&carry) | (firstBit&carry); 
    } 
    if (carry)  result = '1' + result; 
    return result; 
} 

Đây là lời giải thích mình search nhưng đọc không hiểu

Giải thích cho mình với, cám ơn mọi người.

Nhận xét: result được build tại chỗ.

Bảng +
0 + 0 = 0
1 + 0 = 1
0 + 1 = 1
1 + 1 = 10

Vậy 1-bit adder có thể dùng mạch xor (1 xor 1 = 0). Ta còn nhớ 1 (carry) nữa nên mạch lúc này có:

A, B -> A xor B
carry ->
<- digit = (A xor B) xor carry_in

Vậy carry thì out ra gì?
Với 3 input thì bảng trở thành:

0+1+1 = 10
1+0+1 = 10
1+1+0 = 10
1+1+1 = 11

Chỉ cần hai bit 1 là đủ để bật carry_out, và ta có code như trên.

3 Likes

cám ơn bạn nhiều. Giớ mình mới đề ý đến đoạn 2 trong 3 bit = 1 thi carry được bật. Chứ lúc đầu đọc, mình chưa biết ý nghĩa của biến carry.

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?