シフト演算とは
・2進数をあらわすビット列を、左もしくは右にずらす操作をシフト演算と呼びます
#前知識
・2進数
2進数とは0と1のみで数字を表したもの
普段使っている数は10進数であり、9まで来ると次の位が1つ増えます。
(例)9→10(2桁目が1になる)
つまり、○○進数の○○の部分の数で繰り上がります。
2進数では、2で繰り上がる
(例)1→10(2桁目が1になる)
10進数の2を2進数で表すと10となる
・符号付き2進数について
実はこの2進数にも符号付きと符号無しがあります。
符号なし 2 進数 | 符号つき 2 進数 | ||
---|---|---|---|
2 進数 | 10 進数 | 2 進数 | 10 進数 |
00000000 | 0 | 00000000 | 0 |
00000001 | 1 | 00000001 | 1 |
00000010 | 2 | 00000010 | 2 |
省略 | 省略 | ||
01111101 | 125 | 01111101 | 125 |
01111110 | 126 | 01111110 | 126 |
01111111 | 127 | 01111111 | 127 |
10000000 | 128 | 10000000 | -128 |
10000001 | 129 | 10000001 | -127 |
10000010 | 130 | 10000010 | -126 |
省略 | 省略 | ||
11111101 | 253 | 11111101 | -3 |
11111110 | 254 | 11111110 | -2 |
11111111 | 255 | 11111111 | -1 |
上記の図のように符号付きの場合、最上位の位が0か1で符号が変わる。
(最上位の位がマイナスを表しているが他の位はプラスになるので注意)
なので、符号無しでは0~256の数字が表せて、符号ありでは-128~127が表せます。
#シフト演算
シフト演算には2種類あります。
・論理シフト(符号なし)
・算術シフト(符号あり)
#論理シフト
符号なしについて行うときに使う
2進数を「左or右」ずらしたビット数をnとすると、シフト後の数を「左(2ⁿ倍)or右(1/2ⁿ倍)」したものになる。
上記の図は元の数を2のn乗に当てはまる
(右(1/2ⁿ倍)は逆になります。)
#算術シフト
符号ありについて行うときに使う。
2進数を「左or右」にN個算術シフトすると使いN個「左(2ⁿ倍)or右(1/2ⁿ倍)」にずらすことをいう。
※基本的には論理シフトと同じだが、右にずらした場合は空いたビットは符号ビットで埋めないといけない