Questions sur la POO dans MQL5 - page 93

 
Igor Makanu:

une autre question... Existe-t-il un moyen d'obtenir un int 12 bits via l'union ?... Peu importe comment ))))

SZY : 9-15 bit int idéalement, signe à allouer pas un problème, c'est-à-dire qu'il est possible unsigned int (dans les dernières constructions de MQL apprisunsigned int, il est possible au lieu de uint à utiliser )

Je ne comprends pas... Au secours !)))

J'ai compris que je pouvais allouer certains bits nécessaires de cette façon :

//+------------------------------------------------------------------+
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-битам
}
//+------------------------------------------------------------------+

où le bit le plus significatif serait maintenant , pour déterminer le signe du nombre... ne sait pas, c'est-à-dire qu'idéalement, il devrait s'agir d'une fonction

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

Idéalement, l'utilisation de telles structures devrait être un modèle :

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

Donc, encore une fois, je ne comprends pas... Au secours ! Au secours !)))

J'ai découvert que je peux allouer certains des bits dont j'ai besoin :

où le bit le plus élevé serait maintenant pour déterminer le signe du nombre... ne sait pas, c'est-à-dire qu'idéalement, il devrait s'agir d'une fonction

Idéalement, l'utilisation de telles structures devrait être un modèle :

Voir. Le masque est la partie significative du nombre, c'est à dire que pour int, il faut décaler un bit de plus, puisque le bit haut vous avez le signe signifie. << Le poste est un désordre. Comme dans votre cas, vous prendrez les bits hauts de int par ce masque, alors que vous avez besoin des bits bas))).

Pour les nombres entiers signés, vous devez prendre séparément la partie significative, prendre séparément le bit de poids fort (signe), puis décaler le bit de poids fort à la position requise et utiliser la fonction OU par bit pour les combiner. Exemple pour int-> 4 bits

int mean4=0xFFFFFFFF>>29

int sign16=1<<31

int sign4=1<3

Maintenant int->int4 regardez vos mains :

1. Nous avons int val

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

Ici, nous avons pris le signe de notre nombre et l'avons décalé vers la droite (le bit le plus significatif de int4).

3. mean3val=val&mean4

Ici, nous avons obtenu les trois bits les moins significatifs (partie significative) à travers un masque, le reste est coupé.

4. int out=sign|mean3val

Et ici, nous avons combiné le signe avec la partie significative. Nous avons maintenant 4 bits de poids faible, dans lesquels le bit 4 est le signe, et les bits 1 à 3 sont la partie significative, tous les bits au-dessus de 4 ont une valeur de 0. La gamme de valeurs est -8...7 Et oui, si 8 est introduit, il n'y aura pas de 7 et ce sera 0, car tout sera coupé.

 

Il est plus facile de décaler par le bon nombre de bits et d'utiliser 1 pour le masque. Au moins, c'est plus évident.

Définition du signe : (a>>31)&1 - si 1, alors moins, si 0, alors plus.

 

Je peux faire des bits significatifs à partir de int avec une solution "frontale", mais je ne peux pas faire une solution universelle... Je ne peux pas ! (((

Il est très probable que je n'ai pas expliqué comment et où je veux aller.

il y a 4 octets int / uint, et il y a mon jeu de données, que je veux décompresser dans l'optimiseur.

supposons que j'ai réussi à l'emballer de cette façon :

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

quels types j'ai besoin int_XXX, je n'ai pas encore estimé

mais je veux avoir une convivialité sous la forme de ce code

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

Personne n'a encore trouvé mon erreur ? ))))

Conseil : uint tous les masques devraient être)))

 
Igor Makanu:

Je peux faire des bits significatifs à partir de int avec une solution "frontale", mais je ne peux pas faire une solution universelle... Je ne peux pas ! (((

Il est très probable que je n'ai pas expliqué comment et où je veux aller.

il y a 4 octets int / uint, et il y a mon jeu de données, que je veux décompresser dans l'optimiseur

supposons que j'ai réussi à l'emballer de cette façon :

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

quels types j'ai besoin int_XXX, je n'ai pas encore estimé

mais je veux avoir une facilité d'utilisation sous la forme du code suivant

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 - indentation (bits), l - longueur (nombre de bits), valeur à ajouter, r - où ajouter

Mais je ne l'ai pas testé.

 
Dmitry Fedoseev:

Comme vous ne surchargez pas une fonction virtuelle, vous utilisez la surcharge.


Il y a clairement quelque chose qui ne va pas ici

 
Alexandr Andreev:

Il y a manifestement quelque chose qui ne va pas ici.

Faire de la méthode un modèle et y accéder

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

Faire de la méthode un modèle et y accéder

C'est un laifhack ! !!

ps : +1 moyen d'écrire quelque chose qui cessera de fonctionner avec la mise à jour quand ils modifieront ce loafhack

 
Alexandr Andreev:

C'est une échappatoire ! !!

ps : +1 moyen d'écrire quelque chose qui va juste arrêter de fonctionner avec la mise à jour quand ils vont modifier ce loafhack

class A {
public:
void f( int ) {}
};
class B : public A {
public:
template<typename T>
void f( T ) { ffffffffffff(1); пишу что хочу %<>!!!<>%  } //нормально
};
La bataille pour les nanosecondes semble très étrange face à de tels écarts.