我是论坛的新成员。我试图减去两个二进制数,这些位在数组中存储为char。我有数字作为结构:
struct number {
unsigned char *digits;
size_t number;
};
我减去了另一个函数:
void subtractionTwoBinaryNumbers(number &firstNumber, number &secondNumber) {
for (size_t i = firstNumber.number; i > 0; i--) {
unsigned char mask = 0b00000001;
for (int j = CHAR_BIT - 1; j >= 0; j--) {
if (((mask & firstNumber.digits[i - 1]) > (mask & secondNumber.digits[i - 1])) ||
((mask & firstNumber.digits[i - 1]) == (mask & secondNumber.digits[i - 1]))) {
firstNumber.digits[i - 1] = ((mask & firstNumber.digits[i - 1]) - (mask & secondNumber.digits[i - 1]));
} else if ((mask & firstNumber.digits[i - 1]) < (mask & secondNumber.digits[i - 1])) {
firstNumber.digits[i - 1] = ((mask & secondNumber.digits[i - 1]) - (mask & firstNumber.digits[i - 1]));
}
mask <<= 1;
}
}
}
我在另一个函数中打印该数字并且它正确运行。 我想在firstNumber.digits中计算得分。但得分是:
first number: 00001111
second number: 00000101
score: 00000000
我做错了什么?感谢您对我的问题的每个答案!
答案 0 :(得分:0)
好的,所以...你的代码存在很多问题,我会指出一些问题:
(mask & firstNumber.digits[i - 1]) - (mask & secondNumber.digits[i - 1])
时,您将始终获得0
,1
或-1
。然后将该值存储回firstNumber
,导致您丢失所有其他位。-1
,你实际上做了一个if
语句,可能试图避免这种情况,但请注意你在{{1}中做了同样的操作声明;所以你实际上将else
存回-1
。 (firstNumber
将每一位设置为-1
,最终导致1
并将1 - 1
存储在整个事物中。好的,我会在那里停下来。为了帮助你,我不会修复你的代码,因为有很多错误。相反,我会提出别的建议:
为了使事情更简单,我假设firstNumber比secondNumber更大,并且为了使它明白无误,我还会改变它们的名字
在这种方法中,我必须在调用函数之前检查哪一个更大,如果secondNumber更大,则每当打印反减法的结果时(第二个 - 第一个),您手动发信号为负值。
为避免这种情况,您还可以使用值的否定表示,如下所示:如果设置了第一位,则数字为负数;如果数字为负数,则表示为:0
其中~(number - 1)
是反位运算符。
~