在我的 7 位加法器中,进位不正确,我不知道为什么

In my 7 bit adder the carry bit is incorrect and i don't know why

本文关键字:进位 不正确 我不知道 为什么 我的 加法器      更新时间:2023-10-16

我有这个函数,一切正常,直到a和b都等于1。当这种情况发生时,进位位将变为2,而它应该只有0或1。我的进位位算法错了吗
carry_bits |=((a&掩码)&(b&mask))<lt;1u;

bool add7bits( unsigned int a, unsigned int b, unsigned int *carry_out, unsigned int     *overflow_out, unsigned int *sum_out)
{
if ( a > ( ( 1u << NUM_BITS ) - 1 ) )
{
    cout << "a value: " << a << " is too large" << endl;
    return false;
}
else if ( b > ( ( 1u << NUM_BITS ) - 1 ) )
{
    cout << "b value: " << b << " is too large" << endl;
    return false;
}
else
{
    unsigned int sum_bits = 0;
    unsigned int carry_bits = 0;
    // Use a mask to access the specific bits of interest
    unsigned int mask = 1u;
    // Handle rightmost bit as a half-adder (no carry input)
    // sum = a ^ b
    // c_out = a & b
    sum_bits |= ( a & mask) ^ ( b & mask);
    // The carry _out_ from this stage sets the carry in for the next,
    // that is, the next higher bit in the carry_bits value
    carry_bits |= ((a & mask) & (b & mask)) << 1u;
    // The remaining bits must be handled with the full adder logic. The last
    // adder in the chain's carry out becomes the carry output return
    // value of this function.
            mask = 1u << 1;
            sum_bits |= ((a & mask) ^ (b & mask) ^ carry_bits);
            carry_bits |= ((a & mask) & (b & mask)) << 1u; 
            mask = 1u << 2;
            sum_bits |= ((a & mask) ^ (b & mask) ^ carry_bits);
            carry_bits |= ((a & mask) & (b & mask)) << 1u;
            mask = 1u << 3;
            sum_bits |= ((a & mask) ^ (b & mask) ^ carry_bits);
            carry_bits |= ((a & mask) & (b & mask)) << 1u;
            mask = 1u << 4;
            sum_bits |= ((a & mask) ^ (b & mask) ^ carry_bits);
            carry_bits |= ((a & mask) & (b & mask)) << 1u;          
            mask = 1u << 5;
            sum_bits |= ((a & mask) ^ (b & mask) ^ carry_bits);
            carry_bits |= ((a & mask) & (b & mask)) << 1u;  
    // Handle bit 6 separately.
    mask = 1u << 6;
    sum_bits = ((a ^b) ^ carry_bits);
    carry_bits |= ((a & mask) & (b & mask)) << 1u;

// Determine the overflow by checking if a and b are both 1.
    bool overflow = false;
    if ((a & mask) & (b & mask))
        overflow = true;
    // ...
    //
 *sum_out = sum_bits;
 *carry_out = carry_bits;
 *overflow_out = overflow;
 cout << a << " + " << b << " = " << *sum_out << endl;;
 cout << "Carry: " << *carry_out << endl;
 cout << "Overflow: " << *overflow_out << endl;
    return true;
}
}

进位位是1,它在第二个位置,因此carry_bits...0010,或2。

您正在将之前的所有进位位转换为每个阶段的和位,而不仅仅是当前阶段的进位位。你想要

sum_bits |= ((a & mask) ^ (b & mask) ^ (carry_bits & mask));

在每个阶段,或同等阶段,更简单:

sum_bits |= (a ^ b ^ carry_bits) & mask;

你的结转计算不正确——它没有考虑结转。您想要:

carry_bits |= ((a & b | a & carry_bits | b & carry_bits) & mask) << 1;

你的最后一个进位位是进位位的第8位,所以你想要:

*carry_out = carry_bits >> NUM_BITS;

只写那一点。

"溢出"在这里没有多大意义,因为你似乎在做无符号加法(所以"溢出"就其存在而言,与进位相同)。如果你在做2s补码有符号加法,你需要最后两个进位的异或:

*overflow_out = ((carry_out >> NUM_BITS) ^ (carry_out >> (NUM_BITS-1))) & 1;