勉強： シフト演算とは

# シフト演算とは 
・２進数をあらわすビット列を、左もしくは右にずらす操作を**シフト演算**と呼びます
#前知識
・２進数
　　2進数とは0と1のみで数字を表したもの
　　普段使っている数は10進数であり、9まで来ると次の位が1つ増えます。
　　（例）9→10(2桁目が１になる)
　　つまり、○○進数の○○の部分の数で繰り上がります。
　　2進数では、2で繰り上がる
　　（例）1→10(2桁目が１になる)
　　10進数の2を2進数で表すと10となる
・符号付き２進数について
　　実はこの2進数にも符号付きと符号無しがあります。

<table border="">
<tbody>
<tr bgcolor="#e0e0c4"><th colspan="2">符号なし 2 進数</th>
　<th colspan="2">符号つき 2 進数</th></tr>
　<tr bgcolor="#f0f0d8"><td align="center">2 進数</td>
　<td>&nbsp;10 進数&nbsp;</td><td align="center">2 進数</td><td>&nbsp;10 進数&nbsp;</td></tr>
<tr>
　　<td　align="center">00000000&nbsp;</td><td align="right">0</td>
　　<td><font color="#cc0000">0</font>0000000&nbsp;</td>
　　<td align="right">0&nbsp;</td></tr>
<tr>
    <td align="center">00000001</td>
　　<td align="right"> 1&nbsp;</td>
　　<td align="center"><font color="#cc0000">0</font>0000001</td>
　　<td align="right">1&nbsp;</td></tr><tr><td align="center">00000010</td>
　　<td align="right">2&nbsp;</td>
    <td align="center"><font color="#cc0000">0</font>0000010</td>
    <td align="right">2&nbsp;</td></tr>
<tr>
    <td align="center" colspan="2">省略</td>
    <td align="center" colspan="2">省略</td>
</tr>
<tr>
    <td align="center">01111101</td><td align="right">125&nbsp;</td>
　　<td align="center"><font color="#cc0000">0</font>1111101</td>
　　<td align="right">125&nbsp;</td>
</tr>
<tr>
    <td align="center">01111110</td><td align="right">126&nbsp;</td>
　　<td align="center"><font color="#cc0000">0</font>1111110</td>
　　<td align="right">126&nbsp;</td>
</tr>
<tr>
    <td align="center">01111111</td>
　　<td align="right">127&nbsp;</td>
　　<td align="center"><font color="#cc0000">0</font>1111111</td>
　　<td align="right">127&nbsp;</td>
</tr>
<tr>
    <td align="center">10000000</td>
　　<td align="right">128&nbsp;</td>
　　<td align="center"><font color="#cc0000">1</font>0000000</td>
　　<td align="right">-128&nbsp;</td>
</tr>
<tr>
    <td align="center">10000001</td>
　　<td align="right">129&nbsp;</td>
　　<td align="center"><font color="#cc0000">1</font>0000001</td>
　　<td align="right">-127&nbsp;</td>
</tr>
<tr>
    <td align="center">10000010</td>
　　<td align="right">130&nbsp;</td>
　　<td align="center"><font color="#cc0000">1</font>0000010</td>
　　<td align="right">-126&nbsp;</td>
</tr>
<tr>
    <td align="center" colspan="2">省略</td>
　　<td align="center" colspan="2">省略</td>
</tr>
<tr>
    <td align="center">11111101</td><td align="right">253&nbsp;</td>
　　<td align="center"><font color="#cc0000">1</font>1111101</td>
　　<td align="right">-3&nbsp;</td>
</tr>
<tr>
    <td align="center">11111110</td>
　　<td align="right">254&nbsp;</td>
　　<td align="center"><font color="#cc0000">1</font>1111110</td>
　　<td align="right">-2&nbsp;</td>
</tr>
<tr>
    <td align="center">11111111</td>
　　<td align="right">255&nbsp;</td>
　　<td align="center"><font color="#cc0000">1</font>1111111</td>
　　<td align="right">-1&nbsp;</td>
</tr>
　</tbody>
</table>
 
上記の図のように符号付きの場合、最上位の位が0か1で符号が変わる。
<font color="#cc0000">（最上位の位がマイナスを表しているが他の位はプラスになるので注意）</font>
なので、符号無しでは0~256の数字が表せて、符号ありでは-128~127が表せます。

#シフト演算
　シフト演算には２種類あります。
　　・論理シフト（符号なし）
　　・算術シフト（符号あり）

#論理シフト
 <b>符号なし</b>について行うときに使う
　2進数を「左or右」ずらしたビット数をnとすると、シフト後の数を「左(2ⁿ倍）or右(1/2ⁿ倍）」したものになる。

![図１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686519/b57b646f-f046-571b-9c36-782ab961039d.png)

上記の図は元の数を2のn乗に当てはまる
（右(1/2ⁿ倍）は逆になります。）
#算術シフト
<b>符号あり</b>について行うときに使う。
2進数を「左or右」にN個算術シフトすると使いN個「左(2ⁿ倍）or右(1/2ⁿ倍）」にずらすことをいう。
<font color="#cc0000">※基本的には論理シフトと同じだが、右にずらした場合は空いたビットは符号ビットで埋めないといけない </font>
![図2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686519/48faa307-93eb-aca6-6364-64ff4c3bed7e.png)

# 以上