MQL5'te OOP hakkında sorular - sayfa 93

 
Igor Makanu :

Ve hala böyle bir soru ... ve sendika yoluyla herhangi bir şekilde 12 bit int almak mümkün mü? ... nasıl olduğu değil)))

Not: ideal olarak 9-15 bit int , işareti vurgulamak sorun değil, yani. unsigned int kullanabilirsiniz (son sürümlerde MQL unsigned int öğrendi, uint yerine kullanabilirsiniz)

genel olarak, yine anlamadım ... yardım et ! )))

Bunun gibi gerekli bitlerden bazılarını seçebileceğimi düşündüm:

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

sayının işaretini belirlemek için şimdi en önemli bitin nerede bulunacağı ... Bilmiyorum, yani. ideal olarak bir fonksiyon olmalıdır

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

ideal olarak, bu tür yapıları kullanmak için genellikle bir şablona ihtiyaç vardır:

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

genel olarak, yine anlamadım ... yardım et ! )))

Bunun gibi gerekli bitlerden bazılarını seçebileceğimi düşündüm:

sayının işaretini belirlemek için şimdi en önemli bitin nerede bulunacağı ... Bilmiyorum, yani. ideal olarak bir fonksiyon olmalıdır

ideal olarak, bu tür yapıları kullanmak için bir şablona ihtiyaç vardır:

Bak. Maske, sayının önemli bir parçasıdır, yani int için biraz daha kaydırmak gerekir, çünkü işaretinizin en önemli biti anlamına gelir. <<konum saçmalık. Sizin gibi, bu maskeyi kullanarak int'nin yüksek bitlerini alacaksınız, ancak düşük bitlere ihtiyacınız var))).

İşaretli tamsayılar için, önemli kısmı ayrı ayrı, en anlamlı biti (işareti) ayrı olarak almanız, en anlamlı biti istediğiniz konuma kaydırmanız ve bitsel VEYA birleştirmeniz gerekir. int->4 bit için örnek

int ortalama4=0xFFFFFFFF>>29

int işareti16=1<<31

int işareti4=1<<3

Şimdi int->int4 ellerinize dikkat edin:

1. int val var

2. int işareti=(val&sign16)>>28

Burada sayımızın işaretini aldık ve ihtiyacımız olan pozisyona kaydırdık (int4'teki en yüksek bit)

3.mean3val=val&mean4

Burada maskeden en az önemli üç bit (önemli kısım) elde ettik, diğer her şey kesildi.

4. int çıkış=işaret|ortalama3değer

Ve burada işareti önemli kısımla birleştirdik. Şimdi elimizde 4'ün bir işaret olduğu ve bit 4'ün bir işaret olduğu ve bit 1.3'ün önemli bir parça olduğu en az anlamlı 4 bitimiz var, 4'ten eski tüm bitler 0 değerine sahip. Değer aralığı -8..7'dir. Ve evet, eğer 8 girdiyse, o zaman 7 olmayacak, ancak her şey basitçe kesileceği için 0 olacak.

 

Gerekli sayıda bit ile kaydırmak ve maske için 1 kullanmak daha kolaydır.En azından daha nettir.

İşaret tanımı: (a>>31)&1 - 1 ise eksi, 0 ise artı.

 

Kafa kafaya bir çözümle int'den önemli bitleri çıkarabilirim, ancak evrensel bir çözüm yapabilirim ... ama yapamam! ((((

nasıl ve nerede istediğimi açıklamamış olma ihtimali yüksek

4 int / uint bayt var ve optimize edicide paketlemek istediğim veri kümem var

Diyelim ki bu şekilde paketlemeyi başardım:

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

ne türlere ihtiyacım var int_XXX Henüz düşünmedim

ama bunun gibi bir kod biçiminde kullanılabilirliğe sahip olmak istiyorum

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

Ne, henüz kimse hatamı bulamadı mı?))))

Öneririm: uint tüm maskeler olmalıdır)))

 
Igor Makanu :

Kafa kafaya bir çözümle int'den önemli bitleri çıkarabilirim, ancak evrensel bir çözüm yapamam ... ama yapamam! ((((

nasıl ve nerede istediğimi açıklamamış olma ihtimali yüksek

4 int / uint bayt var ve optimize edicide paketlemek istediğim veri kümem var

Diyelim ki bu şekilde paketlemeyi başardım:

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

ne türlere ihtiyacım var int_XXX Henüz düşünmedim

ama bunun gibi bir kod biçiminde kullanılabilirliğe sahip olmak istiyorum

 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 - girinti (bit), l - uzunluk (bit sayısı), eklenecek değer, r - nereye eklenir

Ama gerçekten kontrol etmedi.

 
Dmitry Fedoseev :

Sanal bir işlevi geçersiz kılmadığınız için aşırı yükleme kullanıyorsunuz.


Burada bir şeyler açıkça yanlış.

 
Alexandr Andreev :

Burada bir şeyler açıkça yanlış.

Bir yöntemi şablon yapın ve ona erişin

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

Bir yöntemi şablon yapın ve ona erişin

Evet, bu bir hack!!!

ps: Bu hayat hack'i düzeltildiğinde güncellemeyle çalışmayı bırakacak bir şey yazmanın +1 yolu

 
Alexandr Andreev :

Evet, bu bir hack!!!

ps: Bu hayat hack'i düzeltildiğinde güncellemeyle çalışmayı bırakacak bir şey yazmanın +1 yolu

 class A {
public :
void f( int ) {}
};
class B : public A {
public:
template < typename T>
void f( T ) { ffffffffffff(1); пишу что хочу %<>!!!<>%  } // нормально
};
bu tür boşlukların arka planına karşı, nanosaniye savaşı çok garip görünüyor