【結論】
・コンピュータは足し算しか出来ない
・掛け算/割り算をする場合は
シフト演算を用いる
・シフト演算とは、指定した回数だけ
ビット列を右もしくは左にズラし
その結果を演算結果として用いる処理
【目次】
- コンピュータは足し算しか出来ない
- シフト演算とは
- 符号なし整数のシフト演算(論理シフト)
- 符号付き整数のシフト演算(算術シフト)
- 2の倍数で計算出来ない場合
- 《今日の学習進捗(3年以内に10000時間に向けて)》
【本題】
コンピュータは足し算しか出来ない
前回記事で取り上げた通り、コンピュータは足し算しか出来ません。
引き算の場合は、2の補数を用いて引き算を行います。
では、掛け算や割り算の場合には、どの様に処理を行うのでしょうか?
そこで登場するのが「シフト演算」です
シフト演算とは
シフト演算とは、指定した回数だけ
ビット列を右または左にズラして、
その結果を演算結果として用いる処理のことです。
具体的な処理の流れですが、
「符号ビット」の有無で処理の方法が変化します。
「符号ビット」とは、ビット列の先頭にある
最上位ビット(MSB:Most Significant Bit)で
数値の正と負を表現したものです(0→正、1→負)
符号ビットがある整数は、符号付き整数
符号ビットが無い整数は、符号なし整数
と呼ばれます。
まずは、符号なし整数のシフト演算の処理をみていきます。
符号なし整数のシフト演算(論理シフト)
符号なし整数のシフト演算は、論理シフトと呼ばれます。
・掛け算
シフト方向:左
空きビット:0を挿入
あふれた値:無視
具体例として「20×4」の計算の流れをみていきます。
4 ↓ 2の2乗 20 ↓ 0010100(2進数に変換) ↓ 1010000(2乗なので、2個左にスライドし、空いたビットに0を挿入、溢れた値は無視)
・割り算
シフト方向:右
空きビット:0を挿入
あふれた値:余りの値とする
具体例として「20÷4」の計算の流れをみていきます。
4 ↓ 2の2乗 20 ↓ 0010100(2進数に変換) ↓ 0000101(2乗なので、2個右にスライドし、空いたビットに0を挿入、溢れた値は0なので余りなし)
符号付き整数のシフト演算(算術シフト)
符号付き整数のシフト演算は、算術シフトと呼ばれます。
・掛け算
シフト方向:左
空きビット:0を挿入
あふれた値:無視
具体例として「-16×4」の計算の流れをみていきます。
4 ↓ 2の2乗 -16 ↓ 11110000(2進数に変換) ↓ 11000000(2乗なので、2個左にスライドし、空いたビットに0を挿入、溢れた値は無視)
・割り算
シフト方向:右
空きビット:符号ビットの値を挿入
あふれた値:余りの値とする
具体例として「-16÷4」の計算の流れをみていきます。
4 ↓ 2の2乗 -16 ↓ 11110000(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時間!」