2010-08-12 22 views
6

Sto cercando un modo veloce per eseguire le seguenti operazioni divison:64 bit per divisione 32 bit

  • dividendi è un po 'intero con segno 64.
  • Il divisore è un numero intero a 32 bit con segno.
  • Il quoziente dovrebbe essere un intero con segno a 64 bit, il resto non è necessario.
  • Dword basso del dividendo è zero.

Sto utilizzando solo i tipi di dati a 32 bit, poiché quelli a 64 bit sono mal supportati dal compilatore e nessun assembly. L'accuratezza può essere in qualche modo compromessa a favore della velocità.

Qualsiasi suggerimento su questo?

+0

Se i tuoi 32 bit inferiori sono 0, non avrai comunque un resto. – ysap

+2

@ysap: non vero. Si consideri '(1L << 32)/3'. –

+0

Sono curioso, stai usando un processore a 32 bit, con un compilatore C ragionevolmente aggiornato, che non supporta bene gli interi a 64 bit? Cos'è questa combinazione frustrante? – mctylr

risposta

2

64/32 la divisione è supportata direttamente da i386 e possibilmente da altre macchine, purché la parola alta del dividendo sia inferiore al divisore (cioè il dividendo è nell'intervallo 32x32-> 64 moltiplicato per il divisore). Se il compilatore ha un supporto minimo per i tipi a 64 bit, potrebbe essere in grado di riconoscere questa situazione e trarne vantaggio.

Supponendo che tu abbia già controllato l'asm generato e scoperto che non ne approfitta, o se sai che la tua CPU non ha un'istruzione di divisione, allora devi semplicemente fare una divisione lunga come hai imparato in scuola elementare .. eccetto che è base 4294967296 invece di base 10.

Si potrebbe provare a leggere la fonte su libgcc, poiché contiene il codice per 64/64 per le macchine che non dispongono di supporto nativo.

Modifica: In realtà, poiché non si dispone di un'operazione di divisione 64/32, è possibile che si desideri utilizzare la base 65536. Ciò è dovuto al fatto che una divisione lunga e ingenua richiede la divisione di un numero "a 2 cifre" con un numero "a una cifra" a ogni passaggio. Certo, ora sei bloccato a fare più passi ...

+1

Knuth ha una discussione sulla divisione lunga e descrive l'algoritmo di divisione lunga. Se segui il percorso di osservazione, Knuth ha un'ottimizzazione in cui puoi lasciare il ciclo in anticipo. È molto difficile da testare, aiuta solo in un piccolo numero di casi e può essere tranquillamente tralasciato. – janm

Problemi correlati