使用环绕式c++对两个数字进行二进制加法运算

binary addition of two numbers with wrap-around c++

本文关键字:数字 两个 二进制 运算 c++      更新时间:2023-10-16

前一天,我问了一个关于两个二进制数相加的问题。我的问题解决了。值是C,这很好,但现在我在回绕方面遇到了麻烦。为了处理环绕值,我创建了另一个数组S,并将C的值(通过a和B的二进制加法获得)复制到S中。执行加法直到进位变为零。值被复制得很好,但在更改S后,垃圾值被保存在S中。我不知道出了什么问题。有人能帮忙吗。提前谢谢。这是代码

char C[9]={'','','','','','','','',''};
char B[9]={'1','1','0','0','0','1','1','1',''};
char A[9]={'1','1','0','0','0','0','1','1',''};
char carry='0';
char sum[9]={'','','','','','','','',''};
for(int i = 7; i >= 0; i--) {
    C[i] = ((A[i] ^ B[i]) ^ carry); 
    carry = ((A[i] & B[i]) | (A[i] & carry)) | (B[i] & carry);
}
strcpy(sum,C);
for(int l = 7; carry!='0'; l--) {
sum[l] = (C[l]) ^ (carry);
carry = C[l] & carry;
}
cout << endl << sum << endl;

我认为应该简单地使用整数而不是char。类似以下内容。

#include <iostream>
using namespace std;
int main() {
  int B[8]={1,1,0,0,0,1,1,1};
  int A[8]={1,1,0,0,0,0,1,1};
  int carry=0;
  int sum[8]={0,0,0,0,0,0,0,0};
  for(int i = 7; i >= 0; i--) {
      sum[i] = ((A[i] ^ B[i]) ^ carry); 
      carry = ((A[i] & B[i]) | (A[i] & carry)) | (B[i] & carry);
  }
  if ( carry ) {
    int carryArray[8] = {0,0,0,0,0,0,0,1};
    carry = 0;
    for(int i = 7; i >= 0; i--) {
      sum[i] = ((A[i] ^ carryArray[i]) ^ carry); 
      carry = ((A[i] & carryArray[i]) | (A[i] & carry)) | (carryArray[i] & carry);
    }
  }
  for(int l = 0; l < 8; l++) {
    cout << sum[l];
  }
  cout << endl;
  return 0;
}

更好的方法是只使用按位运算符(您可以考虑右移和左移)并对整数进行运算。

问题是您操作的ASCII值为0和1,而不是0和1。所以明智地减去/加"0"。

char carry='0';
char sum[9]={'','','','','','','','',''};
for(int i = 7; i >= 0; i--) {
    C[i] = ((((A[i] - '0') ^ (B[i] - '0')) ^ (carry- '0'))) + '0'; 
    carry = ((((A[i] - '0') & (B[i] - '0')) | ((A[i] - '0') & (carry - '0'))) | ((B[i] - '0') & (carry - '0'))) + '0';
}
strcpy(sum, C);
for(int l = 7; carry != '0'; l--) {
    sum[l] = ((C[l] - '0') ^ (carry - '0')) + '0';
    carry = ((C[l] - '0') & (carry - '0'))+ '0'; //be careful about operator precedence.
}