C++ 在字符数组中减去两个二进制

C++ 在字符数组中减去两个二进制,c++,arrays,bit,C++,Arrays,Bit,我是论坛的新成员。我试图减去两个二进制数,这些二进制数存储为数组中的字符。我将数字作为一种结构: struct number { unsigned char *digits; size_t number; }; 我在另一个函数中减去: void subtractionTwoBinaryNumbers(number &firstNumber, number &secondNumber) { for (size_t i = firstNumber.num

我是论坛的新成员。我试图减去两个二进制数,这些二进制数存储为数组中的字符。我将数字作为一种结构:

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[i-1]-掩码和secondNumber.digits[i-1]时,你将得到0、1或-1。然后将该值存储回firstNumber,导致丢失所有其他位。 正如您可能注意到的,上面的减法可能返回-1,您实际上执行了一个if语句,可能是为了避免这种情况,但是请注意,您在else语句中执行了相同的操作;所以实际上是将-1存储回firstNumber-1将每个位设置为1,最终导致1-1,并在整个事件中存储0。 好的,我就到此为止。为了帮助你,我不会修改你的代码,因为有很多错误。相反,我将提出其他建议:

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

struct number {
    unsigned char *digits; 
    size_t length; 
};

// the function returns if biggerNumber is trully bigger than lesserNumber;
// if it returns false, the computed result is wrong (and the original value was lost, you better fix that!)
bool subtractionTwoBinaryNumbers(number* biggerNumber, number* lesserNumber) 
{
    for (size_t i = biggerNumber->length - 1; i >= 0; i--) 
    {
        if (biggerNumber->digits[i] < lesserNumber->digits[i])
        {
            if (i > 1)
            {
                // I'll carry an unit from the higher digit, in order to do the substraction.
                // as in: 12-9 = 0(12)-0(9) = 0(3)-0(0) = 3
                unsigned char aux = -1; // -1 actually means 0b11111111
                aux -= lesserNumber->digits[i];
                biggerNumber->digits[i] += aux;
                --(biggerNumber->digits[i-1]);  
            }
            else
                return false;
        }
        else
            biggerNumber->digits[i] -= lesserNumber->digits[i];
    }

    return true;
}

从什么时候起0b00000001是有效的数字表示法?更喜欢使用std::string而不是字符数组。字符数组受到缓冲区溢出的影响,它们的大小不能轻易改变。我不明白。如果您的值为number::number,为什么不减去两个number::number字段,然后将结果转换为文本二进制版本呢?脱离主题:让成员名称与结构名称相同不是理想的编程实践;这可能会导致混乱和打字错误。我知道这种算法减法不完全,也不能正确工作,但我想将分数存储在字符数组中。对关键字使用define是未定义的行为。M.M,如果你认为它是C++,那么BooL,true和false是KealWordSt的真的。我用纯C编码,这就是我这样做的原因,一旦它们不是C中的关键字;原来这个问题用C和C++来标注;只是后来编辑了日志,检查我的轻描淡写。这个问题可能涉及纯C而不是C++。Cool,我更喜欢它!我的回答解决了你的问题吗?如果有,请确保将其设置为已回答。在C中,使用include获取bools。number&biggerNumber在C中是一个错误,所以您的答案从来没有用纯C编码过
struct number {
    unsigned char *digits; 
    size_t length; 
};

// the function returns if biggerNumber is trully bigger than lesserNumber;
// if it returns false, the computed result is wrong (and the original value was lost, you better fix that!)
bool subtractionTwoBinaryNumbers(number* biggerNumber, number* lesserNumber) 
{
    for (size_t i = biggerNumber->length - 1; i >= 0; i--) 
    {
        if (biggerNumber->digits[i] < lesserNumber->digits[i])
        {
            if (i > 1)
            {
                // I'll carry an unit from the higher digit, in order to do the substraction.
                // as in: 12-9 = 0(12)-0(9) = 0(3)-0(0) = 3
                unsigned char aux = -1; // -1 actually means 0b11111111
                aux -= lesserNumber->digits[i];
                biggerNumber->digits[i] += aux;
                --(biggerNumber->digits[i-1]);  
            }
            else
                return false;
        }
        else
            biggerNumber->digits[i] -= lesserNumber->digits[i];
    }

    return true;
}