在我的 7 位加法器中,进位不正确,我不知道为什么
In my 7 bit adder the carry bit is incorrect and i don't know why
我有这个函数,一切正常,直到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;
相关文章:
- 使用2个键的cpp-stl::优先级队列排序不正确
- 正弦级数方程计算不正确
- 我试图制作一个程序,要求用户输入问题和答案,但程序循环不正确
- 密码登录程序将永远循环并显示不正确的结果
- 在C++中返回不正确的楼层函数值
- 形状对象的旋转和缩放不正确C++
- C++ 读取文件读取文件不正确
- 关于类的 Python 文档 - 对C++的引用不正确
- Pisano 周期生成器在 3 位周期内行为不正确
- 在不添加进位的情况下添加数字的C++程序
- C/C++:uint8_t位域的行为不正确且不一致
- 使用位域的结构大小不正确
- 为什么将0xff移位 24 位会导致值不正确?
- 位图显示不正确
- 在具有 64 位 CPU 的 32 位 Win8 上运行 32 位 Orwell Dev-C++ - 输入指针返回不正确
- Eclipse控制语句大括号缩进不正确
- 在我的 7 位加法器中,进位不正确,我不知道为什么
- Htoi的10位输出不正确
- 从浮点到十六进制的转换在写入内存时不正确
- 布尔数组从位掩码返回不正确的值