Da 64 bit a 32 bit

di il
6 risposte

Da 64 bit a 32 bit

Ciao a tutti.. ho 2 variabili intere a 32 bit che rappresentano la parte alta e la parte bassa di un valore intero a 64 bit.. esiste un algoritmo per ricavare questo intero senza andare in overflow??

p.s. non posso usare i long long int..

grazie in anticipo per le vostre risposte..

6 Risposte

  • Re: Da 64 bit a 32 bit

    Se stai lavorando con un compilatore microsoft puoi usare una variabile intera da 64bit. Il tipo è __int64. Per creare il numero di è sufficente fare così:

    int low;
    int high;
    __int64 n;

    n=((__int64)high)<<32 | low;

    dove low e high sono le due variabili che contengono rispettivamente la parte bassa ed alta del numero.

    Con altri compilatori non so se c'è il tipo intero da 64 bit....mi spiace.
  • Re: Da 64 bit a 32 bit

    Ciao.. ti ringrazio per la risposta, ma come ho scritto prima non ho a disposizione una variabile a 64 bit.. se usi i compilatori ANSI c i tipi a 64 bit sono definiti come long long int..
    ma io sto usando un compilatore per processori MIPS a 32 bit che non prevede dichiarazioni di variabili a 64 bit.. e l'unico modo per gestirle è usare un algoritmo che manipola 2 variabili a 32 bit..
  • Re: Da 64 bit a 32 bit

    Ciao....scusa non avevo capito che non avevi le variabili a 64 bit.
    Di seguito ti scrivo il codice c che fà la sottrazione a l'addizione fra due numeri. La moltiplicazione e la divisione sono più complicate e le mettero eventualmente più avanti.

    Per entrambe le funzioni i parametri l1 e h1 sono la parte bassa e alta del primo operendo (quello a sinistra del - o +), l2 e h2 sono le parti del secondo operando (quello a destra del - o +), l e h sono le parti del risultato.
    
    void Sum(unsigned int l1, unsigned int h1, unsigned int l2, unsigned int h2, unsigned int *l, unsigned int *h){
      if(l2<(0xFFFFFFFF-l1)){
        *l=l1+l2;
        *h=h1+h2;
      }else{
        *l=l2-(0xFFFFFFFF-l1)-1;
        *h=h1+h2+1;
      }
    }
    
    void Sub(unsigned int l1, unsigned int h1, unsigned int l2, unsigned int h2, unsigned int *l, unsigned int *h){
      if(l2<l1){
        l=l1-l2;
        h=h1-h2;
      }else{
        l=0xFFFFFFFF-(l2-l1)+1;
        h=h1-h2;
        if(h>0)
          h--;
        else
          h=0xFFFFFFFF;
      }
    }
    
    Spero che ti vada bene.
  • Re: Da 64 bit a 32 bit

    Ciao... grazie.. sei stato gentilissimo.. ho solo un'ultima domanda da fare.. il contenuto di queste due variabili a 32 bit rappresentano un numero unico a 64 bit in microsecondi.. mi servirebbe una funzione che prenda in input questi due valori a 32 bit e restituisca il loro valore in millisecondi senza andare in overflow..
  • Re: Da 64 bit a 32 bit

    Ecco qua una funzione che divide un numero a 64 bit per 1000. I parametri l1 e h1 sono la parte alta e bassa del numero da dividere mentre l e h sono le parti del risultato.
    void Div1000(unsigned int l1, unsigned int h1, unsigned int *l, unsigned int *h){
      unsigned int q, r, n, i;
    
      *h=h1/1000;
      r=h1-(*h)*1000;
      if(r!=0){
        i=0;
        while((r & 0xF0000000)==0){
          r<<=4;
          i+=4;
        }
        r|=(l1>>(32-i));
        l1=(l1<<i)>>i;
        *l=r/1000;
        r-=(*l)*1000;
        r=r<<(32-i) | l1;
        q=n=r/1000;
        while(q!=0){
          (*l)<<=4;
          q>>=4;
        }
        (*l)|=n;
      }else{
        *l=l1/1000;
      }
    }
    Con una piccola modifica è possibile fare una funzione che divide un numero a 64 bit per uno a 32 bit (basta mettere una variabile al posto di 1000).

    P.S.: Il codice di queste funzioni (Sum, Sub, Div1000) me lo sono inventato.

    Ciao
  • Re: Da 64 bit a 32 bit

    Grazie mille.. mi sei stato di grande aiuto.. alla prossima.. ciao..
Devi accedere o registrarti per scrivere nel forum
6 risposte