2009-07-08 9 views
10

in primo luogo fuori dovrei chiedere:
Qualcuno sa di una corrente implementazione 128b UINT per Java?Java: Implementazione di un 128bit Intero senza segno

Ho bisogno di qualcosa per contenere i valori cardinali naturali. vale a dire: un enorme contatore.
Conosco i BigIntegers, che sono lenti e immutabili. A 128b UINT ha senso ...

Stavo pensando di implementare un OWORD, usando un paio di primitivi primitivi.

Gli overflow generano un'eccezione e non un avvolgimento.

Quale esempio di codice sorgente/blog dovrei cercare per implementare il funzionamento di questa classe?

+0

Implementato qualcosa di simile un anno fa, e tutto quello che posso dire è: spero che non dovrai implementare accurato modulo/divisione ...;) – Tim

+2

Puoi prendere MutableBigInteger da OpenJDK http://www.docjar.org /html/api/java/math/MutableBigInteger.java.html – akarnokd

risposta

0

Perché non utilizzare BigInteger?

+10

BigInteger è _slow_ quando tutto ciò di cui hai bisogno è solo un po 'più di 64 bit .. Si è imbattuto in questo problema un anno fa e si è rivelato 25 volte più lento dell'originale . Vedi questo anwer per i dettagli: http://stackoverflow.com/questions/962747/most-shameful-awesome-language-hack/1084538#1084538 – Tim

+9

Strano che questa sia la risposta accettata, considerando che l'OP ha detto che non voleva BigInteger . –

+4

Tim, il tuo commento contiene un link non funzionante. – Gili

4

Utilizzarei numeri interi a 32 bit come rappresentazione, poiché è necessario un tipo più grande (lungo) per ottenere la precisione extra per il bit di trasporto, il rilevamento e la moltiplicazione dell'overflow. Pensa a un intero a 32 bit come una cifra e applica gli algoritmi della scuola primaria.

+1

È possibile utilizzare bit lunghi a 64 bit bene ==> due volte più velocemente. Un risultato può essere determinato dalle modifiche al bit del segno. –

+0

@Ira Baxter dubito che sarebbe più veloce. Sarebbe possibile ma più complicato per l'aggiunta, ma non per la moltiplicazione. Java BigInteger usa int [], e suppongo che sappiano cosa stanno facendo. – starblue

+0

Se si desidera un pacchetto BigInt ad altissime prestazioni, si utilizza il carattere più grande disponibile per la propria macchina per il quale esiste un supporto per l'istruzione della macchina nativa. È difficile trovare un PC in questi giorni che non sia a 64 bit. Sto dalla mia posizione: usa un lungo. Gli algoritmi nel pacchetto BigInt sono probabilmente tipici della maggior parte dei pacchetti multiprecision; lungo dovrebbe cadere relativamente facilmente in posizione. Le aggiunte di grandi numeri ora richiedono solo la metà dei cicli. Le moltiplicazioni dovrebbero essere 4 volte più veloci perché hai bisogno di 1 prodotto invece di 4 prodotti incrociati a metà larghezza. –

3

Non dirmi che hai intenzione di avere 128 setter e getter statici, uno per ogni bit ??? Definire definitivamente setBit (int index, valore booleano) e getBit (int index) come metodi di istanza.

Altre cose necessarie: un metodo toString() in modo da ottenere una rappresentazione leggibile dall'uomo (a un certo punto si desidera stampare i numeri, penso).

Ricordare che tutti i tipi ordinali in java sono firmati (ad eccezione di char), quindi se si prevede di utilizzare due lunghi, tenere sempre presente che la parte inferiore potrebbe essere problematica per rilevare overflow e tale ... in ogni caso, si avrà un numero di 127 bit a meno che la parte inferiore non venga trattata come un bit a 63 bit.

+0

Dove ha fatto l'OP accennare ai setter per ogni bit? –

+0

http://stackoverflow.com/revisions/1096964/list dovresti dare un'occhiata prima di criticare. – fortran

+1

OK, ora lo vedo. Non mi aspettavo di dover leggere le revisioni di una domanda per capirlo; sembra un po 'esagerato. Ho annullato la tua risposta. –

Problemi correlati