MQL5におけるOOPに関する質問 - ページ 93

 
Igor Makanu:

もうひとつお聞きしたいのですが12bitのintをunionで取得する方法はないのでしょうか?どうってことはない )))

SZY: 9-15ビットintが理想的、符号は問題なく割り当てられる、つまりunsigned intが可能(MQLの最後のビルドでunsigned intを 学んだ、それは使用するuintの代わりに可能である)。

理解できない......助けてくれ!)))

この方法で、必要なビットを割り当てることができると考えたのです。

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

今なら最上位ビットで数値の符号が 決まるところ...がわからない、つまり理想的には関数であるべきです。

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

理想を言えば、このような構造を全く使わないことがテンプレートであるべきなのです。

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

だからまた分からないんだ...助けて!助けて!」。)))

必要なビットの一部を割り当てることができることを理解しました。

今なら最上位ビットが数字の符号を決定 するところ...がわからない、つまり理想的には関数であるべきです。

理想を言えば、このような構造を全く使わないことがテンプレートであるべきなのです。

ご覧ください。マスクは数値の有効部分、つまりintの場合、持っている上位ビットが符号を意味するので、さらに1ビットシフトする必要があります。<<posが滅茶苦茶あなたの場合、このマスクでintの上位ビットを取り、下位ビットを必要とします)))。

符号付き整数の場合、有効部分と上位ビット(符号)を別々に取り、上位ビットを必要な位置にシフトして、ビット毎ORで結合する必要があります。int-> 4ビットの場合の例

int mean4=0xFFFFFFFF>>29

int sign16=1<<31

int sign4=1<3

さて、int->int4は手元を見てください。

1. int valがある。

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

ここでは、数値の符号を取り、右の位置(int4 の最上位ビット)にシフトしています。

3. mean3val=val&mean4

ここでは、最下位3ビット(意味のある部分)をマスクを通して取得し、残りは切り取っています。

4. int out=sign|mean3val

そして、ここでは符号と有意な部分を組み合わせています。ここで、4つの低次ビットがありますが、このうちビット4が符号、ビット1から3が有意部分で、4以上のビットはすべて値0となります。値の範囲は-8...7 そして、そう、8が入力されると、7は存在せず、すべてが切り捨てられるだけなので、0になります。

 

正しいビット数でシフトし、マスクに1を使用する方が簡単です。少なくとも、よりわかりやすくなっています。

符号の定義:(a>>31)&1 - 1ならマイナス、0ならプラス。

 

intから有意なビットを作るのは「ヘッドオン」ソリューションで可能ですが、ユニバーサルソリューションは作れない...。無理です!((

どこをどうしたいのか、説明していない可能性が高いです。

4 バイトの int / uint があり、オプティマイザで解凍 したいデータセットがある。

仮にこのように梱包することに成功したとします。

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

int_XXXがどのようなタイプであるか、まだ見積もっていない。

が、このコードのような形でユーザビリティを確保したい。

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

まだ誰も私のエラーを発見していないのでしょうか?)

ヒントuint すべてのマスクがそうでなければなりません)))

 
Igor Makanu:

intから有意なビットを作るのは「ヘッドオン」ソリューションで可能ですが、ユニバーサルソリューションは作れない...。無理です!((

どこをどうしたいのか、説明していない可能性が高いです。

4バイトのint / uintがあり、オプティマイザで展開 したいデータセットがあります。

仮にこのように梱包することに成功したとします。

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

int_XXXがどのようなタイプであるか、まだ見積もっていない。

が、以下のコードのような形で使い勝手を良くしたい。

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 - インデント(ビット数),l - 長さ(ビット数),加算する値,r - 加算する場所.

でも、テストはしていないんです。

 
Dmitry Fedoseev:

仮想関数を オーバーライドしているわけではないので、オーバーロードを使用していることになります。


明らかにおかしい

 
Alexandr Andreev:

明らかにおかしいんです。

メソッドをテンプレート化し、それにアクセスする

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

メソッドをテンプレート化し、それにアクセスする

ライフハックじゃん!!!!

ps: +1 ローフハックに手を加えるとアップデートで動かなくなる書き方

 
Alexandr Andreev:

それは抜け道だ!!!

ps: +1 このloafhackをいじるとアップデートで動かなくなるような書き方です。

class A {
public:
void f( int ) {}
};
class B : public A {
public:
template<typename T>
void f( T ) { ffffffffffff(1); пишу что хочу %<>!!!<>%  } //нормально
};
このようなギャップを前にすると、ナノ秒の戦いが とても奇異に映ります