2014-04-19 23 views
6

In C++, è possibile definire numeri interi di lunghezza arbitrari?C++ interi di lunghezza arbitrari

Quindi, invece di dover usare uint64_t per qualcosa tra 33 e 64 bit, potrei definire i miei numeri interi a 34 bit, 36 bit, ecc.

+0

+1. Interessante. Aspettando una risposta. –

+0

Se ci si trova nell'intervallo degli interi definiti dall'architettura della macchina, è possibile utilizzare ['std :: bitset <>'] (http://en.cppreference.com/w/cpp/utility/bitset) per limitare i numeri a un numero specifico di bit. –

risposta

1

Il compilatore ha i propri tipi come hai menzionato. lungo (32 bit sulla maggior parte delle piattaforme) e lungo (64 bit sulla maggior parte delle piattaforme). Se hai bisogno di supporto per numeri interi più grandi, puoi usare librerie diverse che limitano la dimensione del numero intero alla dimensione della tua memoria.

Biblioteche:

+0

Quello era un ingiusto downvote quindi l'ho risolto –

+0

Puramente per interesse; Boost Multiprecision supporta non power-of-two integer size? – slugonamission

+0

@slugonamission - I computer sono binari. Come possono sdo qualcosa di diverso? –

1

Per il calcolo darebbe non vi è alcun vantaggio perché i processori odierni sono ottimizzati per aritmetica a 32 o 64 bit.

Se sono necessari per problemi di dimensioni, potrebbe avere senso definire il proprio contenitore di numeri n bit e questo potrebbe essere facilmente codificato.

Ancora più generale potrebbe essere un contenitore per i numeri mod-n (vale a dire per i numeri da 0 a n-1, non necessariamente per modulo con una potenza esatta di due). Per questo una soluzione facile (ma non lo spazio ottimale) potrebbe essere basata sulla massima potenza di n che si adatta a un intero a 64 bit (ad esempio è possibile impacchettare 22 numeri tra 0 e 6 in un numero singolo compreso tra 0 e 2 ** 64 -1).

+0

Il tuo nome utente sta uscendo con te - era 6502A o 6502B? Qualunque ombra RAM? BBC o Acorn Electon? –

+0

@EdHeal: Apple] [:-) – 6502

+0

Non sapevo che Apple avesse un processore 6502 –