如何在C中添加二进制数?

问题描述

我目前正在做一项大学任务,我必须在 C 中添加两个二进制数(没有数组)。我理解算法,我的意思是,如何添加二进制数,但我不知道如何将其编写为代码。 在此特定练习中,用户必须为每个操作数输入两位数字(0 或 1)。 a1 和 a2 用于第一个操作数,b1 和 b2 用于第二个操作数。例如:

用户为第一个二进制数引入 1 1 (a1,a2),为第二个引入 0 1 (b1,b2)。结果 (100) 是程序必须返回的结果。我已经看过一些代码示例,但仍然不明白它是如何工作的。使用 if 和 else if 语句我可以理解其中的一部分(如果我没记错的话):

if((a2 == 0) && (b2 == 0)) {
sum = 0;
carry = 0;
} 
else if((a2 == 0) && (b2 == 1) || (a2 == 1) && (b2 == 0)) { 
sum = 1;
carry = 0;
} 
else if((a2 == 1) && (b2 == 1)) {
sum = 0;
carry = 1;
{

但是我如何继续? 我想说清楚我不想要代码(如果我想要,我可以从互联网上复制它),我想了解它。

解决方法

评论已经暗示了这一点,但我认为这值得一个关于如何做到这一点的完整答案(在没有 LUT 的情况下合并逻辑电路和代码),所以这里是:

(cy c) = a+b+cy'的真值表:

a b cy'| cy c
-------|-----
0 0 0  |  0 0 
0 0 1  |  0 1
0 1 0  |  0 1
0 1 1  |  1 0
1 0 0  |  0 1 
1 0 1  |  1 0 
1 1 0  |  1 0
1 1 1  |  1 1

Karnaugh maps

[c]     bbb  | [cy]    bbb
      aaa    |       aaa  
    0 1 0 1  |     0 0 1 0
cy' 1 0 1 0  | cy' 0 1 1 1

逻辑方程:

c  = a^b^cy'              // btw this is also how even/odd parity is computed
cy = (cy'&(a|b))|(a&b)

一些示例代码:

void add(int &cy,int &c,int a,int b,int _cy)    // (cy c) = a+b+_cy
    {
    cy=((a|b)&_cy)|(a&b);
    c =a^b^_cy;
    }

...

int a1,a2,b1,b2,c1,c2,cy;   // assuming a2,c2 is lsb that is weird usually lowest index is lsb

// obtain a1,b2
cy=0;                       // cy at start is zero
add(cy,cy);        // lsb bit
add(cy,a1,cy);        // next bit ...
// print cy,c2 as result

...

我不是用 C 编码而是用 C++ 编码,所以我希望没有使用 C 中限制的东西。所以我只是将 1 位加法器打包到一个函数中,并为从 lsb 到 msb 的每一位调用它......如果还有函数是不允许的,那么你需要复制每个位的函数代码并重写变量索引......

注意 a?,b?,c?,cy 的允许值只有 { 0,1 },因为我使用了按位运算符!!!

我也没有优化方程......你可能想使用德摩根定律和/或逻辑恒等式来改进/简化/规范化它们......

如您所见,您可以直接使用逻辑运算符来计算逻辑方程,而无需缓慢的 if/else 语句