Autor Tema: Rotar a travez de 128 bits?  (Leído 1581 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado elgarbe

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2178
Rotar a travez de 128 bits?
« en: 25 de Febrero de 2016, 14:47:42 »
Hola, estoy trabajando con el Cartel LED denuevo.
Hay una parte del código donde me vendría bien tener un tipo de datos de 128bits. Creo que en GCC no existe, no? (mi comilador no me lo toma, tampoco me toma __int128_t)
La principal operacion que quisiera poder hacer es rotaciones y quizá algún enmascarado de bits. Hay alguna forma de armar una estructura o una union para conseguir esto que necesito?

Saludos
-
Leonardo Garberoglio

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Rotar a travez de 128 bits?
« Respuesta #1 en: 25 de Febrero de 2016, 16:16:07 »
Si podes crear una "variable" de 128 bits, el tema esta en que no se si vas a poder hacer operaciones de 128 bits ya que C no permite el overload de los operandos  ( +,*,/,-,[],etc).

Como decis una estructura y podes tener los 128 bits, e iniciar una "variable" de esa forma

Código: [Seleccionar]
typedef struct uint128_t {
         uint32_t   valor[4];
} uint128_t;

Tambien podes crear una union, si es que ademas deseas por ejemplo acceder a bytes y no solo variables de 32 bits.

lo cual vas a poder hacer:

Código: [Seleccionar]
uint128_t variable128numero1, variable128numero2;
Pero NO vas a poder hacer:

Código: [Seleccionar]
variable128numero1 = variable128numero2 + 10;
Ni rotarlo, por que son 4 de 32bits. Y vas a tener que crear una funcion para la asignacion, suma, rotacion, etc , ejemplo:

Código: [Seleccionar]
void suma128 ( uint128_t *var1, uint128_t *var2)
Realmente aparte de C++ no conozco otra forma de como es que podria hacerse. En C++ podrias crear tu libreira y hacerle un overload a esos operandos para que funcionen "por fuera" (para vos ) como una variable gigante de 128 bits y en C solo me queda pensar en funciones.

---------------------

GCC admite el uso de

unsigned __int128_t

Pero ....

Citar
6.8 128-bit Integers

As an extension the integer scalar type __int128 is supported for targets which have an integer mode wide enough to hold 128 bits. Simply write __int128 for a signed 128-bit integer, or unsigned __int128 for an unsigned 128-bit integer. There is no support in GCC for expressing an integer constant of type __int128 for targets with long long integer less than 128 bits wide.

-----------------------------

Creo que eso es lo que preguntabas...
« Última modificación: 25 de Febrero de 2016, 16:18:51 por KILLERJC »

Desconectado elgarbe

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2178
Re:Rotar a travez de 128 bits?
« Respuesta #2 en: 25 de Febrero de 2016, 16:30:39 »
Me había entusiasmado cuando vi el soporte de __uint128_t, pero lo probé y no funionóo y encontré algo parecido a lo que vos pusiste de GCC y la unidad para almacenar esos numeros. Que sería, en definitiva lo que remarcaste en negrita?

Voy a ver que me conviene más...

Despues subo actualizaciones en el post del cartel, que ya esta funcionando por módulo, pero extenderlo a varios módulos me esta costado por eso de los 49bits para maejar 16 led RGB...

saludos y gracias!
-
Leonardo Garberoglio