Я пишу класс для моделирования больших целых чисел. Я сохраняю свои данные как unsigned ints в векторном указателе, называемом данными. Что делает эта функция, она добавляет n к текущему большому целому числу. Кажется, что замедление моей работы связано с использованием длинных значений. Кто-нибудь из вас знает об этом. В настоящее время я должен сделать сумму долгое время, иначе она переполнится.Добавление целых чисел без longs
void Integer::u_add(const Integer & n)
{
std::vector<unsigned int> & tRef = *data;
std::vector<unsigned int> & nRef = *n.data;
const int thisSize = tRef.size();
const int nSize = nRef.size();
int carry = 0;
for(int i = 0; i < nSize || carry; ++i)
{
bool readThis = i < thisSize;
long long sum = (readThis ? (long long)tRef[i] + carry : (long long)carry) + (i < nSize ? nRef[i] : 0);
if(readThis)
tRef[i] = sum % BASE; //Base is 2^32
else
tRef.push_back(sum % BASE);
carry = (sum >= BASE ? 1 : 0);
}
}
Также просто интересно, есть ли какая-либо польза от использования ссылок на указатели только с помощью самих указателей? Я хотел бы использовать tRef [i] или (* data) [i] для доступа к данным.
Вы уверены, что '% БАЗА 'оптимизируется компилятором? Почему бы просто не использовать 'unsigned long long sum' и сделать тип, отлитый от' unsigned int', или скрыть лишние биты поразрядным и (&)? –
Почему указатель на 'vector'? Это редко бывает подходящим; простой «вектор» должен работать нормально, и вам не придется иметь дело с «новым» и «удалять» его. –