Como construir uma biblioteca para manipulação de inteiros grandes de 128 bits? A biblioteca deverá prover as operações aritméticas básicas (somar, subtrair, multiplicar, dividir) e a operação de deslocamento de bits (bit shifting).
A biblioteca deve ser implementada usando a seguinte definição para o tipo do inteiro grande:
#define NUM_INTS 4
typedef unsigned int BigInt[NUM_INTS];
Ou seja, uma variável do tipo BigInt é representada por este array que deve ser interpretado como um único inteiro de 128 bits, em complemento a dois, seguindo a ordem little-endian. Desta forma, o inteiro 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE (igual a -2) é representado pelo array:
{0xFFFFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF }
Para a implementação das operações, devem ser usadas as seguintes prototipações:
/* Operações básicas */
/* res = a + b */
void bi_sum (BigInt res, BigInt a, BigInt ;
/* res = a - b */
void bi_sub (BigInt res, BigInt a, BigInt ;
/* res = a - b */
void bi_mul (BigInt res, BigInt a, BigInt ;
/* res = a - b */
void bi_div (BigInt res, BigInt a, BigInt ;
/* Operações para deslocamento de bits */
/* desloca a de n bits para a direita e grava resultado em res */
void bi_shr (BigInt res, BigInt a, int n);
/* desloca a de n bits para a esquerda e grava resultado em res */
void bi_shl (BigInt res, BigInt a, int n);
Como fazer? Tenho uma parte do programa já pronta, mas estou parado na parte de multiplicacão e divisão de bits. Se alguém quiser conferir, posso postar meu código para análise. Ainda assim, gostaria de um solucão completa, para fins comparativos.
Question
Guest Ninty_CEO
Olá, pessoal. Preciso de ajuda num exercício.
Como construir uma biblioteca para manipulação de inteiros grandes de 128 bits? A biblioteca deverá prover as operações aritméticas básicas (somar, subtrair, multiplicar, dividir) e a operação de deslocamento de bits (bit shifting).
A biblioteca deve ser implementada usando a seguinte definição para o tipo do inteiro grande:
#define NUM_INTS 4
typedef unsigned int BigInt[NUM_INTS];
Ou seja, uma variável do tipo BigInt é representada por este array que deve ser interpretado como um único inteiro de 128 bits, em complemento a dois, seguindo a ordem little-endian. Desta forma, o inteiro 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE (igual a -2) é representado pelo array:
{0xFFFFFFFE, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF }
Para a implementação das operações, devem ser usadas as seguintes prototipações:
/* Operações básicas */
/* res = a + b */
void bi_sum (BigInt res, BigInt a, BigInt ;
/* res = a - b */
void bi_sub (BigInt res, BigInt a, BigInt ;
/* res = a - b */
void bi_mul (BigInt res, BigInt a, BigInt ;
/* res = a - b */
void bi_div (BigInt res, BigInt a, BigInt ;
/* Operações para deslocamento de bits */
/* desloca a de n bits para a direita e grava resultado em res */
void bi_shr (BigInt res, BigInt a, int n);
/* desloca a de n bits para a esquerda e grava resultado em res */
void bi_shl (BigInt res, BigInt a, int n);
Como fazer? Tenho uma parte do programa já pronta, mas estou parado na parte de multiplicacão e divisão de bits. Se alguém quiser conferir, posso postar meu código para análise. Ainda assim, gostaria de um solucão completa, para fins comparativos.
Sinceros abracos,
Ninty_CEO.
Link to comment
Share on other sites
1 answer to this question
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.