#ビット演算でマスク処理
「ビット演算て何に使うん?」と思っていて仕事で使ったのでメモ.
##1. 0-63の数を32個1周期としてみる
0-63の数を32個1周期でみたらどうなんのか?って話.要は32から63までの数が0-31の間のどのインデックスに相当してくれるかって話1.
void main()
{
int array64[64]; // 0-63の数が入る配列の宣言
int array32[64]; // 32個1周期としてみるための配列の宣言
for (int i = 0; i < 64; i++) {
array64[i] = i;
array32[i] = array64[i] & 0x1F; // 0x1F = 31d = 0001 1111b とビットAND演算する⇒マスク処理
printf("元の数=%d,32個1周期=%d\n", array64[i], array32[i]);
}
return;
}
実行結果は下記の通り.
元の数=0,32個1周期=0
元の数=1,32個1周期=1
元の数=2,32個1周期=2
元の数=3,32個1周期=3
元の数=4,32個1周期=4
元の数=5,32個1周期=5
元の数=6,32個1周期=6
元の数=7,32個1周期=7
元の数=8,32個1周期=8
元の数=9,32個1周期=9
元の数=10,32個1周期=10
元の数=11,32個1周期=11
元の数=12,32個1周期=12
元の数=13,32個1周期=13
元の数=14,32個1周期=14
元の数=15,32個1周期=15
元の数=16,32個1周期=16
元の数=17,32個1周期=17
元の数=18,32個1周期=18
元の数=19,32個1周期=19
元の数=20,32個1周期=20
元の数=21,32個1周期=21
元の数=22,32個1周期=22
元の数=23,32個1周期=23
元の数=24,32個1周期=24
元の数=25,32個1周期=25
元の数=26,32個1周期=26
元の数=27,32個1周期=27
元の数=28,32個1周期=28
元の数=29,32個1周期=29
元の数=30,32個1周期=30
元の数=31,32個1周期=31
元の数=32,32個1周期=0
元の数=33,32個1周期=1
元の数=34,32個1周期=2
元の数=35,32個1周期=3
元の数=36,32個1周期=4
元の数=37,32個1周期=5
元の数=38,32個1周期=6
元の数=39,32個1周期=7
元の数=40,32個1周期=8
元の数=41,32個1周期=9
元の数=42,32個1周期=10
元の数=43,32個1周期=11
元の数=44,32個1周期=12
元の数=45,32個1周期=13
元の数=46,32個1周期=14
元の数=47,32個1周期=15
元の数=48,32個1周期=16
元の数=49,32個1周期=17
元の数=50,32個1周期=18
元の数=51,32個1周期=19
元の数=52,32個1周期=20
元の数=53,32個1周期=21
元の数=54,32個1周期=22
元の数=55,32個1周期=23
元の数=56,32個1周期=24
元の数=57,32個1周期=25
元の数=58,32個1周期=26
元の数=59,32個1周期=27
元の数=60,32個1周期=28
元の数=61,32個1周期=29
元の数=62,32個1周期=30
元の数=63,32個1周期=31
0-63の数が0-31の数に変換され32個1周期の数になっていることがわかる.
$2^n-1$は2進数表現で1ビット目から$2^n-1$を表すビットまで全て立っている2.そのため,ビットAND演算立っているところまででマスクできる3.