トップ  >  お問合せ(Contact)  >  ビット演算子
ビット演算子
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 



スポンサーリンク
検索

↑の検索エンジンが表示されない人は、
↓の古い検索エンジンを使用して下さい。
カスタム検索
MQL4リファレンスツリー
スポンサーリンク
スポンサーリンク


Copyright ©2015 MT4でEA自作しちゃお~ All Rights Reserved.


Top

inserted by FC2 system