【问题标题】:How to add binary numbers in C?如何在C中添加二进制数?
【发布时间】:2021-07-09 17:01:46
【问题描述】:

我目前正在做一项大学任务,我必须在 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;
{

但是我该如何继续呢? 我想明确表示我不想要代码(如果我愿意,我可以从互联网上复制它),我想了解它。

【问题讨论】:

  • 您的代码是半加法器。其他数字需要Full Adder才能添加低位进位。
  • 您的困惑究竟是什么?您提供的算法似乎很好(尽管and 不是C 中的关键字)。您只需要考虑更多数字并从前一个数字转发执行。
  • 用最简单的术语来说,您需要对每个数字执行二进制加法。幸运的是,您只需考虑 2 位数。每个添加有 3 个输入,abcarry_in。有两个输出,ccarry_out。对于每个数字,carry_in 值等于先前添加的 carry_out,初始为 carry_in = 0。有了它,全加器的构建块。例如,如果要添加 01 和 01,则有 a1=1b1=1carry_in=0。结果:c1=0carry_out=1。因此,对于下一个数字,您有 a2=0b2=0carry_in=1
  • 好的,但是我如何连接这两个部分。我的意思是,在代码的第一部分: if((a2 == 0) && (b2 == 0) { sum = 0; carry = 0; 我必须把 a1 和 b1 的情况放在那里?跨度>
  • @AKSingh 你错过了我的意思...... OP 是关于具有特定限制(以某种方式做事)的大学任务,特别是没有数组......因为输入是位粒度甚至数组位是不允许的。如果您使用存储在单个整数中的整数,那么它是否被认为是有效的,那么它的老师认为它是否有效..无论如何使用它都会给任务带来“失败”标记的风险。

标签: c algorithm binary numbers addition


【解决方案1】:

cmets 已经暗示了这一点,但我认为这值得一个关于如何做到这一点的完整答案(在没有 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,b2,c2 is lsb that is weird usually lowest index is lsb

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

...

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-29
    • 1970-01-01
    • 2022-01-15
    • 2015-02-01
    • 1970-01-01
    • 2012-01-22
    • 2014-09-26
    • 1970-01-01
    相关资源
    最近更新 更多