2進数の乗除算
2進数の乗算と除算を考えていきましょう。
その前に除算は減算と同じようにより簡単な乗算の応用として定義しましょう。
a / b
は
a * (1/b)
と考えます。
単に論理演算を行っても乗除算は再現できません。
新たな演算を導入し乗除算を考えていきましょう。
シフト演算
10進数の値を10倍、100倍してみるとどうなるでしょう。
123
123は10倍すると
1230
100倍すると
12300
となります。
これを8桁の固定長のデータとして考えてみましょう。
00000123
00001230
00012300
こうするとわかりやすいですね。
10^n倍するごとにn桁左にデータがずれていきます。
最大桁数から繰り上がった桁は消え、ずれて足りなくなった桁には0が補われます。
逆に0.1倍、0.01倍するごとに右にずれていきます。
45600000
04560000
00456000
これは2進数にもあてはまります。
2進数00000101は10進数で5となります。
00000101
これを左に一つずらしてみましょう。
00001010
これは10進数の10となります。
更に一つずらすと
00010100
これは10進数の20です。
このようにr進数にr^n倍するとn桁左にずれていきます。
同様にr^nで割るとn桁右にずれていきます。
このように左右にビットをずらす演算と言い、左にずらすことを左ビットシフト、右にずらすことを右ビットシフトと言います。
また、左に1桁ずらすことを「1ビット左シフトする」と言います。
この応用で何倍でも計算することができます。
例えば7倍を考えてみましょう。
式で考えると以下のようになります。
a * 7
ですが2進数のシフト演算では2、4,8…倍しか作ることができません。
なので式を変形します。
a * (1 + 2 + 4)
これはこう書き表すことができます。
a * (2^0 + 2^1 + 2^2)
この式を整理すると
a * 2^0 + a * 2^1 + a * 2^2
となります。
つまりそれぞれ0、1、2ビットシフトしたものを足すと7倍になります。
割り算も同様に考えることができます。
このようにして乗除算を演算することができます。