MQL5におけるOOPに関する質問 - ページ 93 1...8687888990919293949596 新しいコメント Igor Makanu 2020.09.24 07:04 #921 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; }; Vladimir Simakov 2020.09.24 07:35 #922 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になります。 Dmitry Fedoseev 2020.09.24 07:56 #923 正しいビット数でシフトし、マスクに1を使用する方が簡単です。少なくとも、よりわかりやすくなっています。 符号の定義:(a>>31)&1 - 1ならマイナス、0ならプラス。 Igor Makanu 2020.09.24 08:42 #924 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); Vladimir Simakov 2020.09.24 08:58 #925 まだ誰も私のエラーを発見していないのでしょうか?) ヒントuint すべてのマスクがそうでなければなりません))) Dmitry Fedoseev 2020.09.24 09:41 #926 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 - 加算する場所. でも、テストはしていないんです。 Alexandr Andreev 2020.09.24 10:53 #927 Dmitry Fedoseev:仮想関数を オーバーライドしているわけではないので、オーバーロードを使用していることになります。明らかにおかしい A100 2020.09.24 11:05 #928 Alexandr Andreev:明らかにおかしいんです。 メソッドをテンプレート化し、それにアクセスする class A { template<typename T> void f( T ) {} }; void OnStart() { A а; а.f(0); //нормально } Alexandr Andreev 2020.09.24 17:24 #929 A100:メソッドをテンプレート化し、それにアクセスする ライフハックじゃん!!!! ps: +1 ローフハックに手を加えるとアップデートで動かなくなる書き方 A100 2020.09.24 18:01 #930 Alexandr Andreev:それは抜け道だ!!! ps: +1 このloafhackをいじるとアップデートで動かなくなるような書き方です。class A { public: void f( int ) {} }; class B : public A { public: template<typename T> void f( T ) { ffffffffffff(1); пишу что хочу %<>!!!<>% } //нормально }; このようなギャップを前にすると、ナノ秒の戦いが とても奇異に映ります 1...8687888990919293949596 新しいコメント 取引の機会を逃しています。 無料取引アプリ 8千を超えるシグナルをコピー 金融ニュースで金融マーケットを探索 新規登録 ログイン スペースを含まないラテン文字 このメールにパスワードが送信されます エラーが発生しました Googleでログイン WebサイトポリシーおよびMQL5.COM利用規約に同意します。 新規登録 MQL5.com WebサイトへのログインにCookieの使用を許可します。 ログインするには、ブラウザで必要な設定を有効にしてください。 ログイン/パスワードをお忘れですか? Googleでログイン
もうひとつお聞きしたいのですが12bitのintをunionで取得する方法はないのでしょうか?どうってことはない )))
SZY: 9-15ビットintが理想的、符号は問題なく割り当てられる、つまりunsigned intが可能(MQLの最後のビルドでunsigned intを 学んだ、それは使用するuintの代わりに可能である)。
理解できない......助けてくれ!)))
この方法で、必要なビットを割り当てることができると考えたのです。
今なら最上位ビットで数値の符号が 決まるところ...がわからない、つまり理想的には関数であるべきです。
理想を言えば、このような構造を全く使わないことがテンプレートであるべきなのです。
だからまた分からないんだ...助けて!助けて!」。)))
必要なビットの一部を割り当てることができることを理解しました。
今なら最上位ビットが数字の符号を決定 するところ...がわからない、つまり理想的には関数であるべきです。
理想を言えば、このような構造を全く使わないことがテンプレートであるべきなのです。
ご覧ください。マスクは数値の有効部分、つまり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 があり、オプティマイザで解凍 したいデータセットがある。
仮にこのように梱包することに成功したとします。
int_XXXがどのようなタイプであるか、まだ見積もっていない。
が、このコードのような形でユーザビリティを確保したい。
まだ誰も私のエラーを発見していないのでしょうか?)
ヒントuint すべてのマスクがそうでなければなりません)))
intから有意なビットを作るのは「ヘッドオン」ソリューションで可能ですが、ユニバーサルソリューションは作れない...。無理です!((
どこをどうしたいのか、説明していない可能性が高いです。
4バイトのint / uintがあり、オプティマイザで展開 したいデータセットがあります。
仮にこのように梱包することに成功したとします。
int_XXXがどのようなタイプであるか、まだ見積もっていない。
が、以下のコードのような形で使い勝手を良くしたい。
o - インデント(ビット数),l - 長さ(ビット数),加算する値,r - 加算する場所.
でも、テストはしていないんです。
仮想関数を オーバーライドしているわけではないので、オーバーロードを使用していることになります。
明らかにおかしい
明らかにおかしいんです。
メソッドをテンプレート化し、それにアクセスする
メソッドをテンプレート化し、それにアクセスする
ライフハックじゃん!!!!
ps: +1 ローフハックに手を加えるとアップデートで動かなくなる書き方
それは抜け道だ!!!
ps: +1 このloafhackをいじるとアップデートで動かなくなるような書き方です。