0

これは私の最後の投稿の更新ですが、この動作の仕方を理解するのにはまだまだ多くの問題があります。ビット単位の操作と "フラグ"の設定

void set_flag(int* flag_holder, int flag_position); 
int check_flag(int flag_holder, int flag_position); 

int main(int argc, char* argv[]) 
{ 
    int flag_holder = 0; 
    int i; 
    set_flag(&flag_holder, 3); 
    set_flag(&flag_holder, 16); 
    set_flag(&flag_holder, 31); 
    for(i = 31; i >= 0; i--) { 
     printf("%d", check_flag(flag_holder, i)); 
     if(i % 4 == 0) 
      printf(" "); 
    } 
    printf("\n"); 
    return 0; 
} 

そして、我々は、出力が等しくなるよう、機能SET_FLAGとcheck_flagを書くことになっている割り当てのために:私が理解からそう

1000 0000 0000 0001 0000 0000 0000 1000 

だから私は、主な機能を与えていました"set_flag"関数を使用してn番目のビットが1であることを確認していました。また、 "check_flag"関数は、n番目のビットが0のときは0、1のときは1を返します。 "set_flag"が実際に何をしているのか、3,16、および31がどのように "フラグ"として保存され、 "check_flag"に1として返されるかを理解する。

+0

何を試してみましたか、どこで失敗していますか? [最小限で完全で検証可能なサンプルを作成する方法](http://stackoverflow.com/help/mcve)をお読みください。 –

答えて

0

バイナリ値または16進値を扱う場合、一般的なアプローチは、メイン値に適用するマスクを定義することです。

包括的なOR演算子 '|'を使用して、1つ以上のビットを '1'に簡単に設定できます。

例えば:私たちはあなたがAND演算子「&」を使用することができ、特定のビットをテストするには「1」

main value 01011000 | 
mask  00000001 = 
result  01011001 

にビット#0を設定したい

例えば:私たちがテストしたいですビット#3

main value 01011000 & 
mask  00001000 = 
result  00001000 

注:結果を適切にフォーマットする必要があります。ここでは&オペレーションは、ゼロまたはゼロ以外の値を返します(ただし、必ずしも「1」は必要ありません)。私たちは/チェック1ビットだけを設定するバイナリマスクを必要とするこれらのシナリオで

void set_flag(int* flag_holder, int flag_position) { 
    int mask = 1 << flag_position; 
    flag_holder = flag_holder | mask; 
} 

int check_flag(int flag_holder, int flag_position) { 
    int mask = 1 << flag_position; 
    int check = flag_holder & mask; 
    return (check !=0 ? 1 : 0); 
} 

:だからここ

は、2つの機能SET_FLAGとcheck_flagです。コード "int mask = 1 < < flag_position;"このシングルビットマスクを作成すると、基本的にビット#0を '1'に設定し、左に設定/チェックしたいビットにシフトします。

0

機能SET_FLAGと機能Check_flagは:

void set_flag(int* flag_holder, int flag_position) { 
    int mask = 1 << flag_position; 
    *flag_holder = *flag_holder | mask; 
} 

int check_flag(int flag_holder, int flag_position) { 
    int mask = 1 << flag_position; 
    int check = flag_holder & mask; 

    return (check !=0 ? 1 : 0); 
} 

メインプログラムと一緒に実行して、あなたは所望の出力を取得します。