1

これは私の最後の投稿の更新ですが、これがどのように機能するかを理解するのにまだ苦労しています. だから私は主な機能を与えていました:

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

したがって、私が理解していることから、n 番目のビットが 1 であることを確認するために「set_flag」関数を使用することになっていました。 . "set_flag" が実際に何をしているのか、3、16、31 がどのように "flags" として保存され、"check_flag" で 1 として返されるのかがわかりません。

4

2 に答える 2

0

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

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

例: bit#0 を '1' に設定したい

main value  01011000 | 
mask        00000001 = 
result      01011001

特定のビットをテストするには、AND 演算子「&」を使用できます。

例: ビット #3 をテストしたい

main value  01011000 & 
mask        00001000 = 
result      00001000

注: 結果を適切にフォーマットする必要がある場合があります。ここで & 操作は、ゼロまたはゼロ以外のいずれかを返します (ただし、「1」は必要ありません)。

set_flag と check_flag の 2 つの関数を次に示します。

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

これらのシナリオでは、1 ビットのみを設定/チェックするバイナリ マスクが必要です。コード「int mask = 1 << flag_position;」この単一のビット マスクを作成します。基本的には、ビット #0 を '1' に設定し、設定/チェックする #bit まで左にシフトします。

于 2016-10-08T04:59:29.117 に答える