我有這個功能,一切工作,直到a和b都等於1.當發生這種情況時,進位是2,當它應該是隻有0或1.我的算法是否有進位錯誤
carry_bits | =((a &掩碼)&(b &掩碼))< < 1u;在我的7位加法器進位是不正確的,我不知道爲什麼
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;
}
}
非常感謝!這非常有幫助!我知道我的溢出仍然需要工作。我只是想弄清楚運載工具應該如何工作。你的解釋太棒了! – user2948878 2014-09-28 04:19:35