シフト演算とは

マトリックス基本情報

シフト演算とは

  • シフト演算とは、2進数をあらわすビット列を左または右にずらす操作のことです。
  • シフト演算の方法は「論理シフト」「算術シフト」の2通りがあります。
    例)
    (770)10という数字を(7700)10とすると10倍になり、(77)10とすると1/10倍になり、10倍は1桁増やす操作であり、1/10倍は1桁減らす操作です。
    2進数では、(100)2を(1000)2にすると(4⇨8)2倍になり、(10)2にすると(4⇨2)1/2倍になります。
    コンピュータはこのシフト演算を使い、掛け算や割り算を行っています。

10進数    77     770     7700
        1/10倍     10倍

2進数   10(2)    100(4)   1000(8)
          1/2倍     4倍

論理シフト

  • 論理シフトとは、符号を考慮せずに行うシフト演算のことです。
  • 2進数を左右にnビット論理シフトすると、2^n倍します。

左論理シフト

  • ビット列全体を左にずらす論理シフトのことを「左論理シフト」といいます。
  • 左にずらしたビット数をnとすると、左論理シフト後は元の数を2^n倍したものです。
  • 左論理シフトでは、あふれたビットは捨てます。
    ただし「0」ではなく「1」があふれた場合は、桁溢れとなり、ビット列であらわせる数の限界を超えてしまうという現象が起きます。

例)8ビットの例

0011100056(10)
00111000左に2ビットずらす
0011100000224(10)

溢れた値は捨て、空いたビットに0を入れます
2ビット左にずらしているので、左論理シフト後の値は「56 × 2 ^ 2 = 224」と元の数を2^2倍にした値となっています。

右論理シフト

ビット列全体を右にずらす論理シフトのことを「右論理シフト」といいます。
右にずらしたビット数をnとすると、右論理シフト後は元の数を1/2^n倍したものです。

例)8ビットの例

0011100056(10)
00111000右に2ビットずらす
000011100014(10)

溢れた値は捨て、空いたビットに0を入れます
2ビット右にずらしているので、右論理シフト後の値は「56 × 1/2 ^ 2 = 14」と元の数を1/2^2倍にした値となっています。

算術シフト

  • 算術シフトとは、符号(正、負)付きのシフト演算です。
  • 先頭の1ビットを符号ビット(正 = 0、負 = 1)として扱います。
  • 負の数でもかけ算や割り算ができます。

    左算術シフト

  • ビット列を先頭の値を除いた全体を左にずらす算術シフトのことを「左算術シフト」といいます。
  • 先頭は符号ビットで固定なので、シフト操作は残りのビットに対して行われます。左にずらすと2^n倍になるのは、左論理シフトと同じです。

例)8ビットの例

11111000-8(10)
11111000左に2ビットずらす
1111100000-32(10)

先頭の値は固定します
溢れた値は捨て、空いたビットに0を入れます。
符号ビットが「1」(マイナスの値)である値-8(10)の先頭の値を固定して残り7ビットを左に2ビットずらしています。その結果「-8 × 2^2 = -32」と元の数を2^2にした値となっています。

右算術シフト

  • ビット列を先頭の値を除いた全体を右にずらす算術シフトのことを「右算術シフト」といいます。
  • 先頭は符号ビットで固定なので、シフト操作は残りのビットに対して行われます。
  • ただし、右算術シフトでは空いたビットには符号ビット(先頭の値)が入ります。
  • 右にずらすと1/2^n倍になるのは、右論理シフトと同じです。

例)8ビットの例

11111000-8(10)
11111000右に2ビットずらす
1111111000-2(10)

先頭の値は固定します
溢れた値は捨て、空いたビットに符号ビットと同じ値を入れます

符号ビットが「1」(マイナスの値)である値-8(10)の先頭の値を固定して残り7ビットを右に2ビットずらしています。
その結果「-8 × 1/2^2 = -2」と元の数を1/2^2にした値となっています。
2進数の正、負(+,-)の変換方法はこちらに記載しています。

補数とは

コメント

タイトルとURLをコピーしました