【问题标题】:Binary addition in C, from ArraysC中的二进制加法,来自数组
【发布时间】:2014-12-14 12:15:21
【问题描述】:

我正在尝试在 C 中将两个 5 位二进制数相加。 这是一个二进制补码转换,我只需要在我的原始数字上加一个。 我看到网上有很多可用的代码,但我无法让它在我的实现中运行。我从这个执行中得到 '00010',它应该是 '00100'

这里是

int addBinary(int a[], int b[], int sum[]);

int main(){
   int i=0;
   int g =0;
   int sum[5];

   sum[0] =0;
   sum[1] =0;
   sum[2] =0;
   sum[3] =0;
   sum[4] =0;

   int b[5];
   b[0] =0;
   b[1] =0;
   b[2] =0;
   b[3] =0;
   b[4] =1;

   int set[5];
   set[0] =0;
   set[1] =0;
   set[2] =0;
   set[3] =1;
   set[4] =1;

   addBinary(set,b,sum);

 }


int addBinary(int a[], int b[], int sum[]){
    int i, c = 0;
    for(i = 0; i < 5 ; i++){
       sum[i] = ((a[i] ^ b[i]) ^ c); // c is carry
       c = ((a[i] & b[i]) | (a[i] & c)) | (b[i] & c);
    }

    sum[i] = c;
    int z=0;
    for(z=0; z<5; z++) {
       printf("%d",sum[z]);
    }

    return c;
}

【问题讨论】:

  • 那个缩进是怎么回事?你真的是这样写的吗?
  • 为什么每个 0/1 都使用 32/64 位 int?如果你只想每次加1,为什么要一个参数b?
  • 首先是什么问题?
  • 我在识别我的代码时遇到堆栈溢出问题。
  • 这些数组只是占位符,而我测试添加,真正的数据源来自其他地方。原帖已更新

标签: c gcc binary c99 twos-complement


【解决方案1】:

您正在从 MSB 到 LSB 进行加法,方向错误。

要么将循环更改为从 i=4 开始并向下计数 i,要么更改数组中位的顺序以便 a[0] 是 LSB 并调整打印输出循环(这将更有意义 IMO )。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-21
    • 1970-01-01
    • 2010-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多