DEV Community

kaede
kaede

Posted on

基本情報 Part 04 -- 2 進数の左右シフトと余りの扱い

左右シフトとは?

( 今回は符号ビットは省略するが、符号ビットがある場合、右シフトの挙動は異なることがある。)

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)