Fragen zu OOP in MQL5 - Seite 93

 
Igor Makanu:

eine weitere Frage... Gibt es irgendeine Möglichkeit, einen 12-Bit-Int über Union zu erhalten ... egal wie ))))

SZY: 9-15 bit int idealerweise, Vorzeichen zuweisen kein Problem, d.h. es ist möglich unsigned int (in letzten Builds von MQL gelerntunsigned int, ist es möglich, anstelle von uint zu verwenden)

Ich verstehe das nicht ... Hilfe!)))

Ich habe herausgefunden, dass ich auf diese Weise einige benötigte Bits zuweisen kann:

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

wo das höchstwertige Bit jetzt wäre , um das Vorzeichen der Zahl zu bestimmen... weiß nicht, d.h. idealerweise sollte es eine Funktion sein

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

Idealerweise sollte es eine Vorlage sein, um solche Strukturen überhaupt zu verwenden:

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

Ich verstehe es also wieder nicht... Hilfe!)))

Ich habe herausgefunden, dass ich einige der Bits, die ich brauche, zuweisen kann:

wo das höchste Bit jetzt wäre , um das Vorzeichen der Zahl zu bestimmen... weiß nicht, d.h. idealerweise sollte es eine Funktion sein

Idealerweise sollte es eine Vorlage sein, um solche Strukturen überhaupt zu verwenden:

Siehe. Die Maske ist der signifikante Teil der Zahl, d.h. bei int muss man ein bisschen weiter schieben, da das hohe Bit das Vorzeichen ist. <<Pos ist eine Sauerei. Wie in Ihrem Fall werden Sie die hohen Bits von int durch diese Maske nehmen, während Sie die niedrigen Bits benötigen))).

Bei vorzeichenbehafteten ganzen Zahlen müssen Sie den signifikanten Teil und das hohe Bit (Vorzeichen) getrennt ermitteln, dann das hohe Bit an die gewünschte Position verschieben und mit bitweisem ODER kombinieren. Beispiel für int-> 4 Bits

int mean4=0xFFFFFFFF>>29

int sign16=1<<31

int vorzeichen4=1<3

Achten Sie jetzt auf Ihre Hände: int->int4:

1. wir haben int val

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

Hier haben wir das Vorzeichen unserer Zahl genommen und es an die rechte Position verschoben (das höchstwertige Bit in int4)

3. mean3val=val&mean4

Hier haben wir die drei niedrigstwertigen Bits (sinnvoller Teil) durch eine Maske erhalten, der Rest ist abgeschnitten.

4. int out=sign|mean3val

Und hier haben wir das Zeichen mit dem signifikanten Teil kombiniert. Jetzt haben wir 4 niederwertige Bits, wobei Bit 4 das Vorzeichen ist und die Bits 1 bis 3 den signifikanten Teil darstellen, alle Bits über 4 haben den Wert 0. Der Wertebereich ist -8...7. Und ja, wenn 8 eingegeben wird, gibt es keine 7 und es wird 0 sein, da alles einfach abgeschnitten wird.

 

Es ist einfacher, um die richtige Anzahl von Bits zu verschieben und 1 für die Maske zu verwenden. Zumindest ist es deutlicher.

Vorzeichendefinition: (a>>31)&1 - wenn 1, dann minus, wenn 0, dann plus.

 

Ich kann mit einer "Kopf-an-Kopf"-Lösung signifikante Bits aus int machen, aber ich kann keine Universallösung machen... Ich kann nicht! (((

Es ist sehr wahrscheinlich, dass ich nicht erklärt habe, wie und wohin ich gehen will

es gibt 4 Bytes int / uint, und es gibt mein Dataset, das ich im Optimierer entpacken möchte

Nehmen wir an, es ist mir gelungen, es so zu verpacken:

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

welche Typen ich int_XXX brauche, habe ich noch nicht abgeschätzt

aber ich möchte die Benutzerfreundlichkeit in Form dieses Codes haben

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

Hat noch niemand meinen Fehler gefunden? ))))

Tipp: uint sollten alle Masken sein)))

 
Igor Makanu:

Ich kann mit einer "Head-on"-Lösung signifikante Bits aus int machen, aber ich kann keine Universallösung machen... Ich kann nicht! (((

Es ist sehr wahrscheinlich, dass ich nicht erklärt habe, wie und wohin ich gehen will

es gibt 4 Bytes int / uint, und es gibt mein Dataset, das ich im Optimierer entpacken möchte

Nehmen wir an, es ist mir gelungen, es so zu verpacken:

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

welche Typen ich int_XXX brauche, habe ich noch nicht abgeschätzt

aber ich möchte eine Nutzbarkeit in Form des folgenden Codes haben

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 - Einzug (Bits), l - Länge (Anzahl der Bits), zu addierender Wert, r - wo zu addieren

Aber ich habe es nicht getestet.

 
Dmitry Fedoseev:

Da Sie eine virtuelle Funktion nicht überschreiben, verwenden Sie die Überladung.


Hier ist eindeutig etwas nicht in Ordnung

 
Alexandr Andreev:

Hier ist offensichtlich etwas nicht in Ordnung.

Machen Sie die Methode zu einer Vorlage und rufen Sie sie auf

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

Machen Sie die Methode zu einer Vorlage und rufen Sie sie auf

Das ist ein Laifhack!!!

ps: +1 Weise, etwas zu schreiben, das gerade aufhört, mit der Aktualisierung zu arbeiten, wenn sie diesen loafhack zwicken

 
Alexandr Andreev:

Das ist ein Schlupfloch!!!

ps: +1 Weise, etwas zu schreiben, das gerade aufhört, mit der Aktualisierung zu arbeiten, wenn sie dieses loafhack zwicken

class A {
public:
void f( int ) {}
};
class B : public A {
public:
template<typename T>
void f( T ) { ffffffffffff(1); пишу что хочу %<>!!!<>%  } //нормально
};
Der Kampf um Nanosekunden sieht angesichts solcher Lücken sehr seltsam aus