在char数组中减去两个二进制文件

时间:2017-02-08 20:35:57

标签: c++ arrays bit

我是论坛的新成员。我试图减去两个二进制数,这些位在数组中存储为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

我做错了什么?感谢您对我的问题的每个答案!

1 个答案:

答案 0 :(得分:0)

好的,所以...你的代码存在很多问题,我会指出一些问题:

  1. 当您减去(mask & firstNumber.digits[i - 1]) - (mask & secondNumber.digits[i - 1])时,您将始终获得01-1。然后将该值存储回firstNumber,导致您丢失所有其他位。
  2. 正如您可能已经注意到的那样,上面的减法可以返回-1,你实际上做了一个if语句,可能试图避免这种情况,但请注意你在{{1}中做了同样的操作声明;所以你实际上将else存回-1。 (firstNumber将每一位设置为-1,最终导致1并将1 - 1存储在整个事物中。
  3. 好的,我会在那里停下来。为了帮助你,我不会修复你的代码,因为有很多错误。相反,我会提出别的建议:

    为了使事情更简单,我假设firstNumber比secondNumber更大,并且为了使它明白无误,我还会改变它们的名字 在这种方法中,我必须在调用函数之前检查哪一个更大,如果secondNumber更大,则每当打印反减法的结果时(第二个 - 第一个),您手动发信号为负值。 为避免这种情况,您还可以使用值的否定表示,如下所示:如果设置了第一位,则数字为负数;如果数字为负数,则表示为:0其中~(number - 1)是反位运算符。

    ~