Menu

Category

Archive

logo


C言語でのビットマスキング公式

2014-05-24 16:30:00 +0900
  • このエントリーをはてなブックマークに追加

ビットマスクは画像処理やハッシュテーブルを作成するなど、たくさんの応用例があります。

ある一定の範囲のビットをセット

ある一定のビットをセットするには、

1
2
3
4
5
6
7
8
int main (void)
{
    unsigned short a = 32, c;
    int numbits = 3, startbit = 2;

    c = a | (~((unsigned short) ~0 << numbits) << startbit);
    printf("c = %d\n", c); // 60
}

とします。32 (000 0000 0010 0000) の右から2番目(ゼロから数える)のビットから3つのビットをセットすると、60(000 0000 0011 1100)になります。関係のないビットはそのまま変更されません。

ある一定の範囲のビットをクリア

ある一定のビットをクリアするには、

1
2
3
4
5
6
7
8
int main (void)
{
    unsigned short a = 31, c;
    int numbits = 3, startbit = 1;

    c = a & ~(~((unsigned short) ~0 << numbits) << startbit);
    printf("c = %d\n", c); // 17
}

とします。31(0000 0000 0001 1111)の右から1番目(ゼロから数える)のビットから2つのビットをクリアすると、17(0000 0000 0001 0001)になります。今回も、関係のないビットは変更されません。

ある一定の範囲のビットをオーバーライド

ある一定の範囲のビットをオーバーライドは、下記のとおりです。

1
2
3
4
5
6
7
8
9
10
11
12
int main (void)
{
    unsigned short word = 127;  // 1111111
    unsigned short pattern = 9; // 1001
    
    int numbits = 4, startbit = 2;
    
    word &= ~(~((unsigned short) ~0 << numbits) << startbit);
    word |= pattern << startbit;

    printf("word = %d\n", word); // 103
}

127(1111111) の2番目のビットから9(1001)で上書きしています。

127 = 0000 0000 0111 1111
9 = 0000 0000 0010 0100
103 = 0000 0000 0110 0111