ビットマスクは画像処理やハッシュテーブルを作成するなど、たくさんの応用例があります。
ある一定の範囲のビットをセット
ある一定のビットをセットするには、
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