2011-04-07 13 views
8

gcc 4.4 parece ser cuando agregaron int128_t y tengo que usar el cambio de bit y me he quedado sin espacio para algunos campos de bit.¿Hay alguna manera de hacer entradas de 128 bits en gcc <4.4

Editar: Puede ser porque estoy en una computadora de 32 bits, no hay forma de tenerla para una computadora de 32 bits (Intel Atom), ¿verdad? No me importaría si generara un código de máquina lento y complicado si trabajara como esperaba con un cambio de bit.

Respuesta

1

Puede usar dos entradas de 64 bits, pero luego debe realizar un seguimiento de los bits que se mueven entre.

8

Estoy bastante seguro de que __int128_t está disponible en versiones anteriores de gcc. Acabo de comprobar en 4.2.1 y FreeBSD y sizeof(__int128_t) da 16.

+0

Esto no parece trabajar con el gcc 4.1.2 anterior (por ejemplo, como en RHEL 5) –

4

También podría utilizar una biblioteca. Esto tendría la ventaja de que es portátil (con respecto a la plataforma y el compilador) y usted podría cambiar fácilmente a un tipo de datos aún más grande. Uno que podría recomendar es gmp (incluso si su intención no es manejar bitwidth x, sino variable tan grande como desee).

2

El cambio de bit es muy fácil en cualquier número arbitrario de bits. Solo recuerde cambiar las partes desbordadas a la siguiente extremidad. Eso es todo

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; 
} 

similares de desplazamiento a la derecha

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; 
} 
Cuestiones relacionadas