1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ビット演算でマスク処理

Last updated at Posted at 2018-05-26

#ビット演算でマスク処理

「ビット演算て何に使うん?」と思っていて仕事で使ったのでメモ.

##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

  1. 日本語不自由でごめんなさい.トレーニングします.

  2. やっぱりうまく説明できなかったので例を示す.$2^1-1=1=0001_{(2)}, 2^2-1=3=0011_{(2)},2^3-1=7=0111_{(2)}, 2^4-1=15=1111_{(2)}$

  3. コメントを頂いた通り、符号付きのオペランドに対してビット演算をすることは避けたほうがよいらしい。ビットシフト演算子を使う場合の予期せぬ動作はイメージできる。しかし、ビットAND演算子を用いた場合の予期せぬ動作がイメージできないのでもう少し調べてから追記したい。

1
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?