Domande su OOP in MQL5 - pagina 93

 
Igor Makanu:

un'altra domanda... C'è un modo per ottenere un int a 12 bit tramite l'unione? non importa come ))))

SZY: 9-15 bit int idealmente, segno di allocare non un problema, cioè è possibile unsigned int (nelle ultime build di MQL imparatounsigned int, è possibile invece di uint da utilizzare)

Non lo capisco ... aiuto!)))

Ho capito che posso allocare alcuni bit necessari in questo modo:

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

dove sarebbe ora il bit più significativo, per determinare il segno del numero... non so, cioè idealmente dovrebbe essere una funzione

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

idealmente dovrebbe essere un modello per utilizzare tali strutture:

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

Quindi di nuovo non capisco... aiuto! aiuto!)))

Ho capito che posso allocare alcuni dei bit di cui ho bisogno:

dove il bit più alto sarebbe ora per determinare il segno del numero... non so, cioè idealmente dovrebbe essere una funzione

idealmente dovrebbe essere un modello per utilizzare tali strutture:

Vedere. La maschera è la parte significativa del numero, cioè, per gli int, bisogna spostare un po' più in là, poiché nel bit alto si ha il segno. <<la posizione è un casino. Come nel vostro caso, prenderete i bit alti di int da questa maschera, mentre avete bisogno dei bit bassi))).

Per gli interi firmati, dovete prendere separatamente la parte significativa, prendere separatamente il bit alto (segno), poi spostare il bit alto nella posizione necessaria e usare l'OR bitwise per combinarli. Esempio per int-> 4 bit

int mean4=0xFFFFFFFFFF>>29

int sign16=1<<31

int sign4=1<3

Ora int->int4 guardatevi le mani:

1. abbiamo int val

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

Qui abbiamo preso il segno del nostro numero e lo abbiamo spostato nella posizione giusta (il bit più significativo in int4)

3. mean3val=val&mean4

Qui abbiamo ottenuto i tre bit meno significativi (parte significativa) attraverso una maschera, il resto è tagliato.

4. int out=sign|mean3val

E qui abbiamo combinato il segno con la parte significativa. Ora abbiamo 4 bit di ordine inferiore, in cui il bit 4 è il segno, e i bit da 1 a 3 sono la parte significativa, tutti i bit sopra il 4 hanno un valore di 0. La gamma di valori è -8...7 E sì, se viene immesso 8, non ci sarà nessun 7 e sarà 0, poiché tutto sarà semplicemente tagliato.

 

È più facile spostare del giusto numero di bit e usare 1 per la maschera. Almeno è più evidente.

Definizione del segno: (a>>31)&1 - se 1, allora meno, se 0, allora più.

 

Posso fare dei bit significativi di int con una soluzione "di testa", ma non posso fare una soluzione universale... Non posso! (((

È molto probabile che io non abbia spiegato come e dove voglio andare

ci sono 4 byte int / uint, e c'è il mio dataset, che voglio scompattare nell'ottimizzatore

Supponiamo che io sia riuscito a confezionarlo in questo modo:

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

quali tipi ho bisogno di int_XXX, non ho ancora stimato

ma voglio avere l'usabilità sotto forma di questo codice

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

Nessuno ha ancora trovato il mio errore? ))))

Suggerimento: uint tutte le maschere dovrebbero essere)))

 
Igor Makanu:

Posso fare dei bit significativi di int con una soluzione "di testa", ma non posso fare una soluzione universale... Non posso! (((

È molto probabile che io non abbia spiegato come e dove voglio andare

ci sono 4 byte int / uint, e c'è il mio dataset, che voglio scompattare nell'ottimizzatore

Supponiamo che io sia riuscito a confezionarlo in questo modo:

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

quali tipi ho bisogno di int_XXX, non ho ancora stimato

ma voglio avere un'usabilità nella forma del seguente codice

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 - rientro (bit), l - lunghezza (numero di bit), valore da aggiungere, r - dove aggiungere

Ma non l'ho testato.

 
Dmitry Fedoseev:

Poiché non state sovrascrivendo una funzione virtuale, state usando l'overloading.


C'è chiaramente qualcosa di sbagliato qui

 
Alexandr Andreev:

C'è ovviamente qualcosa di sbagliato qui.

Rendere il metodo un modello e accedervi

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

Rendere il metodo un modello e accedervi

Questo è un laifhack!!!

ps: +1 modo per scrivere qualcosa che smetterà di funzionare con l'aggiornamento quando modificheranno questo loafhack

 
Alexandr Andreev:

Questa è una scappatoia!!!

ps: +1 modo per scrivere qualcosa che smetterà di funzionare con l'aggiornamento quando modificheranno questo loafhack

class A {
public:
void f( int ) {}
};
class B : public A {
public:
template<typename T>
void f( T ) { ffffffffffff(1); пишу что хочу %<>!!!<>%  } //нормально
};
La battaglia per i nanosecondi appare molto strana di fronte a tali lacune