Page 6 - М.Ю. Барышникова, А.Ф. Деон, А.В. Силантьева - СКОРОСТНЫЕ СВОЙСТВА АЛГОРИТМОВ СЛОЖЕНИЯ И ВЫЧИТАНИЯ ЦЕЛЫХ ЧИСЕЛ ПРОИЗВОЛЬНОГО РАЗМЕРА

с помощью проверки результата. Если результат сложения больше,
чем 9, то результирующую цифру получают после вычитания числа
10,
а единицу переноса прибавляют к результату сложения в следу-
ющем разряде. Если по окончании сложения всех цифр существует
последняя единица переноса, то массив результирующего числа уве-
личивается на байт, в который записывается эта единица переноса.
Этот подход реализован в функции
BinaryAdd
( ),
приведенной ниже,
которая возвращает количество цифр в полученном результате:
//
Беззнаковое сложение байтовых чисел в обратном порядке
#
include "BinaryAlign.h" //выравнивание байтовых целых чисел
int BinaryAdd( unsigned char* c,
unsigned char* a, int* pna,
unsigned char* b, int* pnb )
{
int na = *pna; //длина массива a
int nb = *pnb; //длина массива b
int m = BinaryAlign2( a, na, b, nb ); //выравнивание чисел
*
pna = m; //число байт со знаком в слагаемом a
*
pnb = m; //число байт со знаком в слагаемом b
unsigned char tranzit = 0; //единица переноса
int m1=m-1;
for( int i = 0; i < m1; i++ ) //цикл сложения байт
{
unsigned char d = a[i] + b[i] + tranzit;
if( d < 10 ) { c[i] = d; tranzit = 0; }
else { c[i] = d - 10; tranzit = 1; }
}
if( tranzit == 0 ) c[m1] = 43; //знак +
else { c[m1] = 1; c[m++] = 43; }//1 в новом старшем разряде
return m;
}
Если после запуска программы, включающей вызов этой функции,
ввести числа
a
= +5 и
b
= +999, то на мониторе отображается байтовый
массив числа
c
=
a
+
b
= = (+5) + (+999) = +1004:
sa = +5
00000101 00101011
sb = +999
00001001 00001001 00001001 00101011
00000101 00000000 00000000 00101011
00001001 00001001 00001001 00101011
00000100 00000000 00000000 00000001 00101011
44
ISSN 0236-3933. Вестник МГТУ им. Н.Э. Баумана. Сер. “Приборостроение”. 2012