Умножение двух запросов целых чисел на странные ошибки - PullRequest
1 голос
/ 29 июня 2011

это должна быть последняя часть моего целочисленного класса, и это кажется очень простым, и все же, что-то не так.Правильно ли этот код для умножения с использованием 2 запросов?

    // 0x12345 = {0x01, 0x23, 0x45}

    integer operator*(integer rhs){
        // long multiplication
        unsigned int zeros = 0;
        std::deque <uint8_t> row;
        std::deque <std::deque <uint8_t> > temp;
        integer out = 0;
        for(std::deque <uint8_t>::reverse_iterator i = value.rbegin(); i != value.rend(); i++){
            row = std::deque <uint8_t>(zeros++, 0); // zeros on the right hand side
            uint8_t carry = 0;
            for(std::deque <uint8_t>::reverse_iterator j = rhs.value.rbegin(); j != rhs.value.rend(); j++){
                uint16_t prod = (uint16_t(*i) * uint16_t(*j)) + carry;// multiply through
                row.push_front((uint8_t) prod);
                carry = prod >> 8;
            }
            if (carry != 0)
                row.push_front(carry);
            out += integer(row);
        }
        return out;
    }

он мне дает 4931550625 ^ 2 -> 24248133972899962689.Если предположить, что operator+ правильно, что мне кажется, есть ли другое объяснение, почему это неправильно

edit: я обновил код в соответствии с wxffles, но я думаю, что сделал это неправильно,я все еще получаю 2424..., а для 0x25 * 0x25 я получаю 89 (decimal)

edit2: правильный код опубликован

1 Ответ

2 голосов
/ 29 июня 2011

Я думаю, что вы пропустили последний перенос.Вам не нужно:

row.push_front(carry);

непосредственно перед добавлением строки в out?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...