一個簡單的二進位制加法器

weixin_30488085發表於2020-04-06

先用C++隨便宣告一個bit結構體:

struct bit
{
    unsigned char bit_value;
    bit(unsigned int value){
        if (value == 0 || value == 1)
            bit_value = (unsigned char)value;
        else
            bit_value = 0;
    }
    bit()
    {
        bit_value = 0;
    }
};

一位與一位的加法稱為半加器,因為不考慮後面的進位加進來:

//sumbit表示加法位,carrybit表示進位
void halfAdder(bit  operand1, bit operand2, bit &sumbit, bit &carrybit)
{
    sumbit.bit_value = operand1.bit_value^operand2.bit_value;//異或運算得到加法位,異或運算是兩個物件分別或運算和與非運算後,再將兩個結果與運算一下。
    carrybit.bit_value = operand1.bit_value&operand2.bit_value; //與運算得到進位。
}

可以得到兩位:一個加法位(原位)和進位。

如果考慮進位也要加進來,稱為全加器,實際上是三個單bit加運算:

void fullAdder(bit  operand1, bit operand2, bit inputcarrybit, bit &sumbit, bit &carrybit)
{
    bit temp_sumbit, temp_carrybit;
    halfAdder(operand1, operand2, temp_sumbit, temp_carrybit);//半加器先計算輸入的兩位數
    bit temp_carrybit2;
    halfAdder(temp_sumbit, inputcarrybit, sumbit, temp_carrybit2);//半加器再次計算上一步計算所得的加法位和輸入的進位
    carrybit.bit_value = temp_carrybit.bit_value | temp_carrybit2.bit_value;//或運算獲得最後的進位,其實應該用異或,但不可能出現兩種進位都為1的情況
}

全加器是兩個半加器和一個或門的結合。

 

將兩個二進位制數每個位都用全加器計算一下,並聯結起來,便得到最終結果。測試一下:

bit array1[4] = {bit(1),bit(0),bit(0),bit(1)};
bit array2[4] = {bit(0),bit(1),bit(1),bit(1)};
bit array_answer[5];

bit last_carry;
for (int i = 3; i >= 0; i--)
{
    bit carry;
    fullAdder(array1[i], array2[i], last_carry, array_answer[i+1], carry);
    last_carry = carry;
    if (i == 0)//最後一輪
        array_answer[0] = carry;
}

for (int i = 0; i < 5; i++)
    std::cout <<(unsigned int) array_answer[i].bit_value;

 

轉載於:https://www.cnblogs.com/WonderHow/p/6537691.html

相關文章