我有此功能,一切正常,直到a和b都等于1。这种情况下,进位将变为2,而其本应仅为0或1。我的算法是否错误。 进位| =(((a&mask)&(b&mask))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;}} 最佳答案 您正在将每个先前的进位位或到每个阶段的总和中,而不只是当前阶段的进位。你要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;最后一个进位位是carry_bits的第8位,因此您需要:*carry_out = carry_bits >> NUM_BITS;写一点。“溢出”在这里实际上没有多大意义,因为您似乎正在执行无符号加法(因此,“溢出”在其存在的范围内与执行相同)。如果要进行2s补码符号加法,则需要最后两个进位位的异或:*overflow_out = ((carry_out >> NUM_BITS) ^ (carry_out >> (NUM_BITS-1))) & 1;关于c++ - 在我的7位加法器中,进位位不正确,我不知道为什么,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26077157/
10-11 09:19
查看更多