2011-04-07 10 views
8

gcc 4.4 sembra essere quando hanno aggiunto int128_t e ho bisogno di usare il bit shifting e ho esaurito lo spazio per alcuni campi di bit.C'è un modo per fare 128 bit ints su gcc <4.4

Modifica: Potrebbe essere perché sono su computer a 32 bit, non c'è modo di averlo per un computer a 32 bit (Intel Atom), c'è? Non mi interesserebbe se generasse codice macchina lento e complicato se lavorassi come previsto con lo spostamento dei bit.

risposta

1

È possibile utilizzare due valori a 64 bit, ma è necessario tenere traccia dei bit che si spostano.

8

Sono abbastanza sicuro che __int128_t sia disponibile nelle versioni precedenti di gcc. Appena controllato su 4.2.1 e FreeBSD e sizeof(__int128_t) dà 16.

+0

Questo non sembra funzionare con la 4.1.2 gcc in precedenza (ad esempio come in RHEL 5) –

4

Si potrebbe anche usare una libreria. Questo avrebbe il vantaggio che è portatile (per quanto riguarda la piattaforma e il compilatore) e si potrebbe facilmente passare a un tipo di dati ancora più grande. Uno che potrei raccomandare è gmp (anche se la sua intenzione non è quella di gestire la larghezza di bit x, ma variabile grande quanto vuoi).

2

Lo spostamento di bit è molto semplice in qualsiasi numero arbitrario di bit. Ricorda solo di spostare i bit in overflow verso il prossimo arto. Questo è tutto

typedef struct { 
    int64_t high; 
    uint64_t low; 
} int128_t; 


int128_t shift_left(int128_t v, unsigned shiftcount) 
{ 
    int128_t result; 
    result.high = (v.high << shiftcount) | (v.low >> (64 - shiftcount)); 
    result.low = v.low << shiftcount; 
    return result; 
} 

Simile per spostamento a destra

int128_t shift_right(int128_t v, unsigned shiftcount) 
{ 
    int128_t result; 
    result.low = (v.low >> shiftcount) | (v.high << (64 - shiftcount)); 
    result.high = v.high >> shiftcount; 
    return result; 
} 
Problemi correlati