左右シフトとは?
( 今回は符号ビットは省略するが、符号ビットがある場合、右シフトの挙動は異なることがある。)
2 進数の数値を左右に動かすこと。動かした後には 0 が入る。
左シフトすると数値が大きくなり、右シフトでは数値が小さくなる
例1
- 0010 を左に 2 つシフトする
- 1000 になる
10 進数だと、2 が 8 になっている。
例2
- 1010 を右に 2 つシフトする
- 0010 になる
10 進数だと、10 が 2 になっている。
左シフト ( *2^n )
n つ 左にシフトさせる場合、2^n をかける。
0010 を 左に 2 つシフトさせたい。
そのためには、2^2 をかける必要がある。
2^2 = 4 をかけると、左に 2 つシフトして、1000 になる。
掛け算なので、余りはない。
右シフト ( /2^n )
n つ 右にシフトさせる場合、2^n で割る。
1001 を 右に 2 つシフトさせたい。
そのためには、2^2 で割る必要がある。
2^2 = 4 で割ると、右に 2 つシフトして、0010 になる。
割り算なので、余りが現れる。
しかし、余りはビットシフト操作では直接考慮されず、シフトされたビットは単に破棄される。
なので、1001 を 右に 2 つシフトさせた場合は 0010 で終わり。
しかし、余りを必要とする場合もある。
その場合、余りは追い出された 01 になる。
実例
読みやすくするために、個人ルールとして 4 桁でカンマをつける。
以下の 16 ビットの 2 進数がある
1111,0000,0000,1111
これを 8 つ右シフトする。
すると
- 答え: 0000,0000,1111,0000
- 余り: 0000,1111
になる
Top comments (0)