使用环绕式c++对两个数字进行二进制加法运算
binary addition of two numbers with wrap-around c++
前一天,我问了一个关于两个二进制数相加的问题。我的问题解决了。值是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.
}
相关文章:
- C++通过数字比较两个数字
- 将向量之间的数字放在另一个向量之间<vector>>如果两个数字的差值为 1
- 在 txt 文件中显示前两个数字的程序
- 两个有符号数字之间的距离
- 形成一个斐波那契三角形,使得每个数字是上面左对角线或右对角线上两个数字的总和
- 将数字表示为两个三角形数字的总和
- 两个数字的对称配对功能
- 无法理解代码背后的逻辑,这是在两个给定数字之间生成素数的优化问题
- 查找中间两个数字的正则表达式的匹配项
- 使用C++具有两个数字的最短路径算法.(C++)
- 将两个数字添加为链表
- C++ 分段错误:11 错误,同时编码将两个数字相加的链接列表
- 如何对两个 4 位数字进行乘法,将它们视为 C++ 中的多项式
- 在手臂氖中高效计算两个不同的数字
- 如何在 c++ 中添加两个大的双精度数字
- 我应该如何使用remove_if删除两个数字范围内的元素
- C++显示两个区间之间的数字的程序检查一个数字是否可以表示为两个素数的总和
- 是否有任何内置函数可以检查给定的两个数字在给定整数数组中的顺序是否相同?
- 如何在两个不同大小的向量中找到公共数字
- 如何使用C++中不是文字的变量在数字中显示单引号和两个引号?假设 6'2" 英尺