[Help] Calculo a 64 bit usando 2 variaveis de 32bit !

JAFoNEXUS

Power Member
Humm, é o seguinte:

Tenho um valor de 64bits dividido em 2 variaveis de 32 (32bit mais significativos e 32bit menos significativos).

Quero fazer uma operação sobre este valor de 64bits (neste caso, uma divisão por um valor).

Alguém já fez algo do género? Basicamente ando aqui às voltas com a matemática da coisa e ainda não cheguei a nenhuma conclusão de jeito !!

Thank you!
 
Porque não se trata de matemática, com a solução matemática não vais lá. Lê a matéria e puxa um bocado pela tola.
 
Já passei a "matéria" há uns anos, isto é mesmo um problema da vida real ! Já estou um bocado enferrujado nisto das manipulações de bits, e shifts e assim ... mas lá tenho de me safar!

Mania de usarem variáveis de 64bit -.-' !
 
Usar uma biblioteca de BigInteger da linguagem que estás a usar não é uma solução? Se tens mesmo 2 variáveis de 32bits não deves andar muito longe de C, e já que é a vida real, podes ser mais prático.
 
Usar uma biblioteca de BigInteger da linguagem que estás a usar não é uma solução? Se tens mesmo 2 variáveis de 32bits não deves andar muito longe de C, e já que é a vida real, podes ser mais prático.

nops, não é C. Nem são PC's tão pouco. São outro tipo de equipamentos programáveis, vamos imaginar que é um sistema embebido mto especifico!
 
nops, não é C. Nem são PC's tão pouco. São outro tipo de equipamentos programáveis, vamos imaginar que é um sistema embebido mto especifico!

Mas não usas uma linguagem tipo C ou Java e depois compilas o código para esses equipamentos.

Tens de andar a brincar aos shifts aos or's, aos xor e aos and, pura diversão :)
 
esses 64bits é um double, int ou float? :P

basicamente tenho duas double words (unsingned ints de 32bit) com a parte mais e a menos significativa da minha grandeza de 64 bits.

Aqui basicamente nunca existem registos de 64 bits, portanto todas as manipulações dessa minha grandeza são usando no máximo variáveis de 32bit.

v1=16#FFFFFFFF
v2=16#FFFFFFFF

imaginem q esse valor de 64 bit é um contador que armazena em v1 e v2, parte mais e menos significativa.

Eu quero pegar nesse contador (64bit) e fazer uma divisão por um numero e e dps armazenar este valor , v3 e v4 por exemplo, outros 2 registos de 32 bit que ficam com o resultado da operação.

Acho q deve dar para fazer fazendo shifts e AND's mas ainda não consegui chegar a nada... -.-'
 
Tenho código para isso em C++, se quiseres posso-te mandar para adaptares. Está um pouco compacto, mas é pequeno pelo que deve dar para perceber bem.
É de uma biblioteca de BigIntegers que armazena os números grandes num array de long longs, operando sobre eles.
 
Tenho código para isso em C++, se quiseres posso-te mandar para adaptares. Está um pouco compacto, mas é pequeno pelo que deve dar para perceber bem.
É de uma biblioteca de BigIntegers que armazena os números grandes num array de long longs, operando sobre eles.

Agradecia, posso dar uma olhadela para ver como fazes :) !
 
Isso tambem depende da arquitetura, eu fiz isso no emulador no MIPS32 sei que em inteiros para multiplicar bastava uns shifts adora quando era para float e doubles ai começava tudo a complicar pois estes não permitem esses shifts.
Agora não me recordo como cheguei a fazer isso :X
 
Não é preciso ir ao nível do bit para fazer isso: como o hardware já suporta as operações de "alto nível" (multiplicações, divisões), basta usá-las nas precisões que o cpu suporta. Ou seja, escolher como base um valor facilmente gerido pela máquina -- eg, numa arquitectura de 32 bits, usar 2^16 bits, 2^8 bits ou simplesmente 10 -- e usar somas, divisões, subtracções, etc num array com valores nessas bases.

Talvez o mais fácil no teu caso seja usar um array de 8x8 bytes (8 chars):

Código:
union num {
        struct {
                unsigned int v1, v2; /* atenção ao endianess do cpu */
        } t32;
        unsigned char t8[8];
};

Fazer as contas em t8, apanhar os resultados em v1,v2.

Dito isto, a implementação continua a não ser trivial, mas já é mais fácil começar daqui. Agora basta encontrar um algoritmo / implementação suficiente razoável de multipla/arbitrária precisão. Dois exemplos:
- http://www.cs.sunysb.edu/~skiena/392/programs/bignum.c
- http://code.google.com/p/cii/source/browse/trunk/src/xp.c

O primeiro é o mais simples e totalmente auto-contido, mas usam base 10 num array de chars. Seria preciso adaptar as estruturas de dados.
O segundo é a implementação MP do livro "C interfaces and implementations", do David Hanson da Microsoft. O código é bastante mais complexo, mas usa base 256 (2^8) em char arrays, o que mapeia directamente na representação binária de cima (union.t8).
 
Back
Topo