Стоит такая задача: необходимо написать пограмму на СИ++ умножения целых переменных произвольной длины с использованием операций сложения и сдвига.
Порывшись в источниках на эту тему получил вот что:
#include <stdio.h>
#include <conio.h>
void add(unsigned char out[], unsigned char in1[],
unsigned char in2[], int n)
{int i;
int carry; // Бит переноса
unsigned w; // Рабочая переменная для сложения двух байтов
for (i=0, carry=0; i<n; i++)
{
out [i] = w = in1[i]+in2[i]+carry;
carry = (w & 0x0100) >>8;
}}
void lshift(unsigned char in[], int n)
{ int carry; // Бит переноса
int i,z;
for (carry=0, i=0; i<n; i++)
{
z=(in[i] & 0x80)>>7; // Выделить старший бит (перенос)
in[i] <<= 1; // Сдвинуть влево и установить
in[i] |=carry; // старый перенос в младший бит
carry = z; // Запомнить новый перенос
}}
void rshift(unsigned char in[], int n)
{
int carry; // Бит переноса
int i,z;
for (carry=0, i=n-1; i>=0; i--)
{
z = in[i] & 1; // Выделить младший бит (перенос)
in[i] >>= 1; // Сдвинуть вправо и установить
in[i] |= carry <<7; // старый перенос в старший бит
carry = z; // Запомнить новый перенос
}}
void mul(unsigned char out[], unsigned char aa[], unsigned char bb[], int n)
{
int i;
for (i=0; i<n; i++) out[i]=0;
for (i=0; i< n* 8; i++)
{ // Цикл по количеству битов
if (bb[0] & 1 ) // Разряд множителя равен 1
add(out,out,aa,n); // Добавить множимое к произведению
lshift(aa,n); // Множимое — влево
rshift(bb,n); // Множитель — вправо
}}
void main()
{
unsigned int a1, b1, out1;
unsigned char *out, *a, *b;
clrscr();
printf("Введите два числа : \n");
scanf("%d",&a1);
scanf("%d",&b1);
a = new char[sizeof(int)];
b = new char[sizeof(int)];
out = new char[sizeof(long int)];
a = (unsigned char*) a1;
b = (unsigned char*) b1;
mul(out,a,b,sizeof(long));
for(int i=0; i<8; i++)
printf("%d ", out[i]);
out1 = (int) out;
printf("\n%d\n",out1);
getch();
}
но проблема заключается в том, что в out записывается 0, помогите найти ошибку пожалуйста!