Какую операцию выполняет функция?

int function(uint32_t *r, const uint32_t *a, const uint32_t *b, int n)
{
 int i;
 uint32_t ri, c=0;
 for (i = 0; i < n; i ++)
 {
   ri = a[i] + b[i] + c;
   c = ((ri < a[i]) || ((ri == a[i]) && c));
   r[i] = ri;
 }
   return ((int) c);
}

Приведенная ниже функция C имеет четыре аргумента: r, a и b — указатели на массивы типа uint32_t. Целое число n определяет длину этих массивов (т. е. все три массива содержат одинаковое количество элементов). Возвращаемое значение имеет тип int. Может ли кто-нибудь помочь мне понять операцию, выполняемую этой функцией?


person user3351250    schedule 01.03.2014    source источник


Ответы (2)


Он выполняет сложение с множественной точностью с распространением переноса. Аргументы a и b являются указателями на целые числа повышенной точности, содержащие n цифры в каждом. В этом случае цифры 32-битные. Наименее значащие цифры находятся в младших индексах массива.

Входные данные добавляются, а результат помещается в массив, на который указывает r (также содержащий n 32-битных цифр). Он работает путем добавления цифры из a к цифре из b с переносом c, который инициализируется нулем. Перенос обнаруживается, когда результирующая цифра меньше одной из входных цифр или равна одной из цифр, когда перенос равен 1. Возвращаемое значение является переносом всей операции.

Представьте, что мы складываем цифры с основанием 10. Если мы вычислим 9+9+0 по модулю 10, мы получим 8. Поскольку 8 меньше 9, мы делаем вывод, что должен был быть перенос. Если мы вычислим 9+9+1 по модулю 10, мы получим 9; мы делаем вывод о переносе, потому что был установлен перенос. Если мы вычислим 9+0+0, мы получим 9, но переноса не было, потому что перенос был равен 0.

person pat    schedule 01.03.2014

Для каждого элемента цикла временная переменная хранит сумму двух соответствующих элементов в a и b и добавляет 1, если установлен флаг. Затем флаг устанавливается, когда результат меньше, чем элемент в a, и сбрасывается, если он больше. Этот результат сохраняется в новом массиве. Очевидно, мы можем видеть, что результат меньше (больше), чем элемент в a if b[i] + c < 0 (>). Однако оба индекса должны быть положительными; если сумма трех сложений в сумме меньше одного из них, то происходит перенос. Таким образом, переменная c содержит информацию о том, переполнилось ли сложение, и это эквивалентно переносу 1 на следующую пару элементов. Таким образом, эта функция добавляет беззнаковые числа произвольной точности a и b (представленные как массивы с прямым порядком байтов), копирует результат в r и возвращает значение, указывающее на наличие переполнения.

person bb94    schedule 01.03.2014