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

Представленная ниже функция
BigIntSubtract
( )
управляет процес-
сом вычитания произвольных целых чисел с произвольными знаками:
//
Вычитание байтовых чисел в обратном порядке
#
include "BinaryAlign.h" //выравнивание байтовых целых чисел
#
include "BinaryAdd.h"
#
include "BinarySubtract.h"
int BigIntSubtract( unsigned char* c,
unsigned char* a, int* pna,
unsigned char* b, int* pnb )
{
int na = *pna; //длина числа a
int nb = *pnb; //длина числа b
int nc = 0;
if( a[na-1] == ’+’ && b[nb-1] == ’+’ ) //a >= 0, b >= 0
return nc = BinarySubtract( c, a, pna, b, pnb ); //c=a-b
if( a[na-1] == ’-’ && b[nb-1] == ’+’ ) //a < 0, b >= 0
{
nc = BinaryAdd( c, a, pna, b, pnb ); //c = a + b
c[nc-1] = ’-’; //c = -( a + b )
return nc;
}
if( a[na-1] == ’+’ && b[nb-1] == ’-’ ) //a >= 0, b < 0
return nc = BinaryAdd( c, a, pna, b, pnb ); //c = a + b
if( a[na-1] == ’-’ && b[nb-1] == ’-’ ) //a < 0, b < 0
return nc = BinarySubtract( c, b, pnb, a, pna ); //c=b-a
return nc;
}
При вводе чисел
a
=
9
и
b
=
1005
на мониторе отобразится
результат вычитания
c
=
a
b
= (
9)
(
1005)
= 1005
9
= +0996
,
выполненный по алгоритму вычитания беззнаковых чисел:
sa = -9
00001001 00101101
sb = -1005
00000101 00000000 00000000 00000101 00101101
00001001 00000000 00000000 00000000 00101101
00000101 00000000 00000000 00000101 00101101
00000110 00001001 00001001 00000000 00101011
Скоростные свойства алгоритма функции вычитания
BigIntSub-
tract
( )
определяются набором выполняемых инструкций в теле
функции. На первом этапе первые три инструкции
int na
=
pna
;
ISSN 0236-3933. Вестник МГТУ им. Н.Э. Баумана. Сер. “Приборостроение”. 2012
53