1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

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

Discussão em 'Programação' iniciada por JAFoNEXUS, 27 de Setembro de 2012. (Respostas: 11; Visualizações: 1260)

  1. JAFoNEXUS

    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!
     
  2. tripas

    tripas To fold or to FOLD?

    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.
     
  3. JAFoNEXUS

    JAFoNEXUS Power Member

    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 -.-' !
     
  4. Warrior

    Warrior Power Member

    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.
     
  5. JAFoNEXUS

    JAFoNEXUS Power Member

    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!
     
  6. tripas

    tripas To fold or to FOLD?

    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 :)
     
  7. MoLt1eS

    MoLt1eS Power Member

    esses 64bits é um double, int ou float? :P
     
  8. JAFoNEXUS

    JAFoNEXUS Power Member

    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... -.-'
     
  9. Warrior

    Warrior Power Member

    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.
     
  10. JAFoNEXUS

    JAFoNEXUS Power Member

    Agradecia, posso dar uma olhadela para ver como fazes :) !
     
  11. MoLt1eS

    MoLt1eS Power Member

    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
     
  12. badsatan

    badsatan Power Member

    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).
     

Partilhar esta Página