論理シフトと算術シフト

f:id:ryoutaku_jo:20190403205420p:plain

【結論】

・コンピュータは足し算しか出来ない

・掛け算/割り算をする場合は
 シフト演算を用いる

・シフト演算とは、指定した回数だけ
 ビット列を右もしくは左にズラし
 その結果を演算結果として用いる処理

【目次】

【本題】

コンピュータは足し算しか出来ない

前回記事で取り上げた通り、コンピュータは足し算しか出来ません。
引き算の場合は、2の補数を用いて引き算を行います。

ryoutaku-jo.hatenablog.com

では、掛け算や割り算の場合には、どの様に処理を行うのでしょうか?
そこで登場するのが「シフト演算」です

シフト演算とは

シフト演算とは、指定した回数だけ
ビット列を右または左にズラして、
その結果を演算結果として用いる処理のことです。

具体的な処理の流れですが、
「符号ビット」の有無で処理の方法が変化します。

「符号ビット」とは、ビット列の先頭にある
最上位ビット(MSB:Most Significant Bit)で
数値の正と負を表現したものです(0→正、1→負)

符号ビットがある整数は、符号付き整数
符号ビットが無い整数は、符号なし整数
と呼ばれます。

まずは、符号なし整数のシフト演算の処理をみていきます。

符号なし整数のシフト演算(論理シフト)

符号なし整数のシフト演算は、論理シフトと呼ばれます。

・掛け算
シフト方向:左
空きビット:0を挿入
あふれた値:無視

具体例として「20×4」の計算の流れをみていきます。

4
↓
2の2乗

200010100(2進数に変換)
↓
1010000(2乗なので、2個左にスライドし、空いたビットに0を挿入、溢れた値は無視)

・割り算
シフト方向:右
空きビット:0を挿入
あふれた値:余りの値とする

具体例として「20÷4」の計算の流れをみていきます。

4
↓
2の2乗

200010100(2進数に変換)
↓
0000101(2乗なので、2個右にスライドし、空いたビットに0を挿入、溢れた値は0なので余りなし)

符号付き整数のシフト演算(算術シフト)

符号付き整数のシフト演算は、算術シフトと呼ばれます。

・掛け算
シフト方向:左
空きビット:0を挿入
あふれた値:無視

具体例として「-16×4」の計算の流れをみていきます。

4
↓
2の2乗

-1611110000(2進数に変換)
↓
11000000(2乗なので、2個左にスライドし、空いたビットに0を挿入、溢れた値は無視)

・割り算
シフト方向:右
空きビット:符号ビットの値を挿入
あふれた値:余りの値とする

具体例として「-16÷4」の計算の流れをみていきます。

4
↓
2の2乗

-1611110000(2進数に変換)
↓
11111100(2乗なので、2個右にスライドし、空いたビットに符号ビットの1を挿入、溢れた値は0なので余りなし)

2の倍数で計算出来ない場合

論理シフト・算術シフト共に、
2倍数で計算する場合であれば、そのまま使えますが、
÷5や×7など、2の倍数以外では加工が必要です。

その場合は、「5=2^2+1」「7=2^3+1」の様に、
2の倍数と+1という形に置き換えて計算を行います。

《今日の学習進捗(3年以内に10000時間に向けて)》

学習開始からの期間 :117日
今日までの合計時間:1104h
一日あたりの平均学習時間:9.5h
今日までに到達すべき目標時間:1068h
目標との解離:36h
「10,000時間」まで、

残り・・・「8896時間!」