Preguntas sobre POO en MQL5 - página 93

 
Igor Makanu:

otra pregunta... ¿Hay alguna manera de obtener un int de 12 bits a través de la unión? no importa cómo ))))

SZY: 9-15 bit int idealmente, el signo para asignar no es un problema, es decir, es posible unsigned int (en las últimas construcciones de MQL aprendióunsigned int, es posible en lugar de uint a utilizar )

No lo entiendo... ¡ayuda!)))

Me he dado cuenta de que puedo asignar algunos bits necesarios de esta manera:

//+------------------------------------------------------------------+
uint ConvertUintToXBits(const uint value, const int pos, const int cnt_bits)
{
   uint mask = (0xFFFFFFFF >> (sizeof(uint) - cnt_bits)) << pos;  // получили битовую маску
   uint result = value & mask;                                    // выделили биты числа
   return(result >> pos);                                         // сдвинули чтобы привести к 32-битам
}
//+------------------------------------------------------------------+

donde el bit más significativo sería ahora para determinar el signo del número... no lo sé, es decir, lo ideal es que sea una función

int ConvertUintToXBits(const uint value, const int pos, const int cnt_bits)

idealmente debería ser una plantilla para utilizar tales estructuras en absoluto:

struct Int12
{
private:
   const int bits;
public:
   Int12(const uint IntValue): bits(12) {ConvertUintToXBits.......}
   int value;
};
 
Igor Makanu:

Así que de nuevo no lo entiendo... ¡ayuda! ¡ayuda!)))

Me he dado cuenta de que puedo asignar algunos de los bits que necesito:

donde el bit más alto sería ahora para determinar el signo del número... no lo sé, es decir, lo ideal es que sea una función

idealmente debería ser una plantilla para utilizar tales estructuras en absoluto:

Ver. La máscara es la parte significativa del número, es decir, para int, hay que desplazar un poco más, ya que el bit alto que se tiene significa el signo. <<Los depósitos son un desastre>>. Como en tu caso, tomarás los bits altos de int por esta máscara, mientras que necesitas los bits bajos)).

Para los enteros con signo, hay que tomar por separado la parte significativa, tomar por separado el bit alto (signo), luego desplazar el bit alto a la posición necesaria y utilizar el OR a nivel de bits para combinarlos. Ejemplo para int-> 4 bits

int media4=0xFFFFFF>>29

int sign16=1<<31

int sign4=1<3

Ahora int->int4 mira tus manos:

1. tenemos int val

2. int sign=(val&sign16)>>28.

Aquí hemos tomado el signo de nuestro número y lo hemos desplazado a la posición derecha (el bit más significativo de int4)

3. mean3val=val&mean4

Aquí hemos obtenido los tres bits menos significativos (parte significativa) a través de una máscara, el resto está recortado.

4. int out=signo|media3val

Y aquí hemos combinado el signo con la parte significativa. Ahora tenemos 4 bits de orden inferior, en los que el bit 4 es el signo, y los bits 1 a 3 son la parte significativa, todos los bits por encima de 4 tienen un valor de 0. El rango de valores es -8...7 Y sí, si se introduce 8, no habrá 7 y será 0, ya que todo se cortará.

 

Es más fácil desplazarse por el número correcto de bits y usar 1 para la máscara. Al menos es más evidente.

Definición del signo: (a>>31)&1 - si 1, entonces menos, si 0, entonces más.

 

Puedo hacer trozos significativos de int con una solución "de frente", pero no puedo hacer una solución universal... ¡No puedo! (((

Es muy probable que no haya explicado cómo y dónde quiero ir

hay 4 bytes int / uint, y ahí está mi conjunto de datos, que quiero desempaquetar en el optimizador

Supongamos que he conseguido empaquetarlo de esta manera:

0-8 9-16 17-24 25-32
int_11 int_9 int_12

qué tipos necesito int_XXX, aún no he estimado

pero quiero tener la usabilidad en la forma de este código

input int param1 = 0xFFFFFFF;
int MyParam_1 = ConVertUintToIntXXX((uint)param1, 0, 11);
int MyParam_2 = ConVertUintToIntXXX((uint)param1, 12, 9);
int MyParam_3 = ConVertUintToIntXXX((uint)param1, 21,12);
 

¿Aún no ha encontrado nadie mi error? ))))

Consejo: uint todas las máscaras deben ser))

 
Igor Makanu:

Puedo hacer trozos significativos de int con una solución "de frente", pero no puedo hacer una solución universal... ¡No puedo! (((

Es muy probable que no haya explicado cómo y dónde quiero ir

hay 4 bytes int / uint, y ahí está mi conjunto de datos, que quiero desempaquetar en el optimizador

Supongamos que he conseguido empaquetarlo de esta manera:

0-8 9-16 17-24 25-32
int_11 int_9 int_12

qué tipos necesito int_XXX, aún no he estimado

pero quiero tener una usabilidad en la forma del siguiente código

int add(int o,int l,int v,int r){
   int m=(int)MathPow(2,l)-1;
   r=~r;   
   r=r|(m<<o);
   r=~r;
   r=r|(v<<o);
   return(r);
}

int extract(int o,int l,int r){
   int m=(int)MathPow(2,l)-1;
   return((r>>o)&m);
}

o - sangría (bits), l - longitud (número de bits), valor a añadir, r - dónde añadir

Pero no lo he probado.

 
Dmitry Fedoseev:

Como no está sobrescribiendo una función virtual, está utilizando la sobrecarga.


Claramente hay algo mal aquí

 
Alexandr Andreev:

Es evidente que hay algo que no funciona.

Convertir el método en una plantilla y acceder a ella

class A {
template<typename T>
void f( T ) {}
};
void OnStart()
{
        A а;
        а.f(0); //нормально
}
 
A100:

Convertir el método en una plantilla y acceder a ella

¡¡Eso es un laifhack!!

ps: +1 forma de escribir algo que simplemente dejará de funcionar con la actualización cuando retoquen este loafhack

 
Alexandr Andreev:

¡¡Eso es una laguna jurídica!!

ps: +1 forma de escribir algo que simplemente dejará de funcionar con la actualización cuando retoquen este loafhack

class A {
public:
void f( int ) {}
};
class B : public A {
public:
template<typename T>
void f( T ) { ffffffffffff(1); пишу что хочу %<>!!!<>%  } //нормально
};
La batalla por los nanosegundos se ve muy extraña ante tales lagunas