Q. ビット演算子を使ってカウンターを作りたいのですがMQLのビットシフトについて詳しい説明がどこにもありません。 ググってここにたどり着いたのですが今一つ理解できません。 私が作りたいカウンターはエントリーサインが出ても最初は見送るとか2回目を見送るとかできる右ビットシフトし何番目のビットが1かで見送るということがしたいのです。 分からない所 1.ビットの数8ビット?16ビット? 2.最初のビットを1とする方法。 3.ANDとったらtrue,falseが返ってくるのか? 4.ビットをリセットする方法。 |
A. C言語のビット演算子はご存知でしょうか?基本的にMQLのビット演算子も同じになります。 簡単なサンプルソースを作成しましたので、以下サンプルソースを参考にしてみて下さい。 >1.ビットの数8ビット?16ビット? 使用可能なビット数については、変数の型に依存しますので、データ型のページを参照して下さい。 ちなみにMQL4のintは32bitになります。 >2.最初のビットを1とする方法。 int temp_int |= 0x01; >3.ANDとったらtrue,falseが返ってくるのか? ANDをとったらマスクされたビットの値が返ってきます。true,falseは返ってきません。 int temp_int = 0xFFFF; int mask_int = temp_int & 0x0010; // mask_intの値は0x0010; >4.ビットをリセットする方法。 1の補数でマスクします。 int temp_int = 0xFFFF; uint mask_int = temp_int & ~0x0010; // mask_intの値は0xFFEF; |
enum enum_bit_no { E_1bit = 0x00000001 , // 1ビット目 E_2bit = 0x00000002 , // 2ビット目 E_3bit = 0x00000004 , // 3ビット目 E_4bit = 0x00000008 , // 4ビット目 E_5bit = 0x00000010 , // 5ビット目 E_6bit = 0x00000020 , // 6ビット目 E_7bit = 0x00000040 , // 7ビット目 E_8bit = 0x00000080 // 8ビット目 }; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { int temp_bit; temp_bit = 0; printf( "[%d]%s 0x%08x" , __LINE__ , "0初期化", temp_bit ); temp_bit = E_1bit; // 1bit設定 printf( "[%d]%s 0x%08x" , __LINE__ , "1bitセット", temp_bit ); temp_bit = temp_bit << 1; // 1bitシフト printf( "[%d]%s 0x%08x" , __LINE__ , "1bitシフト", temp_bit ); temp_bit = temp_bit << 1; // 1bitシフト printf( "[%d]%s 0x%08x" , __LINE__ , "1bitシフト", temp_bit ); temp_bit = temp_bit | E_2bit; // 2bit論理和 printf( "[%d]%s 0x%08x" , __LINE__ , "2bit論理和", temp_bit ); // 3ビット目にビットが立っているか判定 if ( ( temp_bit & E_3bit ) == E_3bit ) { printf( "[%d]%s 元データ:0x%08x 論理積:0x%08x" , __LINE__ , "3bit目の判定", temp_bit , temp_bit & E_3bit); } // 3ビット目だけビットを落とす。 temp_bit = temp_bit & ( ~E_3bit ); printf( "[%d]%s 0x%08x ビット反転:0x%08x" , __LINE__ , "3bit目を落とす", temp_bit , (~E_3bit) ); return(INIT_SUCCEEDED); }
[28]0初期化 0x00000000 [32]1bitセット 0x00000001 [36]1bitシフト 0x00000002 [40]1bitシフト 0x00000004 [44]2bit論理和 0x00000006 [48]3bit目の判定 元データ:0x00000006 論理積:0x00000004 [54]3bit目を落とす 0x00000002 ビット反転: 0xfffffffb