O objetivo deste trabalho é construir uma biblioteca para manipulação de inteiros grandes. A biblioteca deverá prover algumas operações aritméticas básicas (somar, subtrair, multiplicar) e operações de deslocamento de bits.
A biblioteca deve ser implementada em C, usando a seguinte definição para o tipo do inteiro grande:
typedef unsigned char *BigInt;
Uma variável do tipo BigInt é representada por um array de bytes que deve ser interpretado como um único inteiro de N bits, em complemento a dois, seguindo a ordem little-endian. O valor de N será fornecido na inicialização da biblioteca (ver abaixo). Desta forma, o array:
{0xFE, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF}
representaria o inteiro
0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE
(igual a -2) em 128 bits.
/* Inicialização da biblioteca */ /* nbits sempre maior que 0 e múltiplo de 8 */ void bi_init (int nbits); /* Criação e destruição */ /* cria novo BigInt com valor inicial val */ BigInt bi_new (int val); /* destroi BigInt */ void bi_destroy (BigInt a); /* Operacoes basicas */ /* a + b */ BigInt bi_sum (BigInt a, BigInt b); /* -a */ BigInt bi_minus (BigInt a); /* a - b */ BigInt bi_sub (BigInt a, BigInt b); /* a * b */ BigInt bi_mul (BigInt a, BigInt b); /* Operacoes de deslocamento */ /* desloca a de n bits para a direita */ BigInt bi_shr (BigInt a, int n); /* desloca a de n bits para a esquerda */ BigInt bi_shl (BigInt a, int n);
O produto deste trabalho deve ser um arquivo em C com nome "bigint.c" contendo apenas a implementação das funções acima. O arquivo bigint.c deverá conter a linha
#include bigint.h
teste.c
,
contendo uma função main
. Este arquivo deverá
conter a linha:
#include "bigint.h"
Crie seu programa executável teste
com a linha:
gcc -Wall -o teste bigint.c teste.c
Recomendações:
bigint.c
, contendo a implementação
das funções pedidas (e eventualmente, funções auxiliares)
e um arquivo rel.txt
, contendo um
relatório em texto (ver abaixo).
bigint.c
*não* deve conter uma função main
.
/* Nome_do_Aluno1 Matricula */ /* Nome_do_Aluno2 Matricula */