Menu

Category

Archive

logo


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

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

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

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

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

1 int main (void)
2 {
3     unsigned short a = 32, c;
4     int numbits = 3, startbit = 2;
5 
6     c = a | (~((unsigned short) ~0 << numbits) << startbit);
7     printf("c = %d\n", c); // 60
8 }

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

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

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

1 int main (void)
2 {
3     unsigned short a = 31, c;
4     int numbits = 3, startbit = 1;
5 
6     c = a & ~(~((unsigned short) ~0 << numbits) << startbit);
7     printf("c = %d\n", c); // 17
8 }

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

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

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

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

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

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