小数点の表現
オーバーフロービットは2の補数で役に立ちますが、あんまり使ったためしはありません。
微妙な表現が欲しいので、小数点を使ってみました。フロート(浮動小数点数)と呼ばれるもので、C言語ではfloatになります。
(例)3.4を2進数へ変換。
整数部分3と小数部分0.4を個別に考えて、整数部分は1バイトであれば0000 0011(2)。
0.4を2進数へ変換させます。
10進数から2進数を作る時は2で割って余りを出したのに対し、
小数点を2進数へ変換させるには2を掛けていきます。
掛けた段階で1を超えれば1を取り出して、その積から1を引いて再び小数点部分を掛けていきます。
掛けた段階で1を超えなければそのまま積の部分を掛けていきます。
8ビット欲しいので8回繰り返します。
出てきた0と1を今度は上から読むと01100110となります。
小数点なので.01100110が正解です。
確認のために各桁の重みを掛けていきます。
それぞれの重みは、2-1,2-2,2-3,2-4…,2-7となるため、
1がある所だけ加えていきます。
2-2+2-3+2-6+2-7=1/4+1/8+1/64+1/128=0.3984375となります。
少し誤差が出ましたが、8ビットなので仕方のないためです。それ以上についてはビット数をもっと増やすしかありません。
小数点→2進数へ変換
どういった時に使うかというと、2フレームで1ドット移動させたい場合は、0.10(2)ドットを毎回加えていきます。
弱点はメモリが2倍かかることと、処理も2倍近く増えてしまうと言う事です。
(補足)0.5ドットなら、2進数に直すと0000 0000.1000 0000なので、-0.5ドットとか符号が反転する場合は、
同じように各ビットを反転して1を加えます。1111 1111.1000 0000が、-0.5ドットになります。
掛け算。
掛け算も同じです。 左シフトと加算を繰り返せば実現できます。
※1バイトでも、最低8回はループさせてシフト+加算を繰り返さないといけないので、処理が1/60秒では間に合わない
事態が発生するかもしれません。
(整数×整数)から見ていきます。
0000 1010(2) 10進数の10(掛けられる数)
×)0000 0101(2) 10進数の5(掛ける数)
ーーーーーーーーー
0000 1010(2) 掛ける数のbit0が1なので、1回目は掛けられる数がそのまま来ます。
+)0010 1000(2) 掛ける数のbit2が1なので、掛けられる数を左へ2回シフトして加えます。
−−−−−−−
0011 0010(2) 答えは…50。上手くいきました。
(2の補数×整数)を見てみます。
1111 1111(2) -1(2の補数)
×)0000 0011(2) 3
−−−−−−−
1111 1111(2)
+)1111 1110(2)
−−−−−−−
(c)1111 1101(2) 答えは…-3。
(2の補数×整数)の続きです。
1111 0001(2) -15(2の補数)
×)0000 1000(2) 8
−−−−−−−−
1000 1000(2) 答えは…-120。オーバーフローしない間では成り立ちます。
今度は見るほうを反転して、(整数×2の補数)を見てみます。
0000 0011(2) 3と
×)1111 1111(2) -1を掛けてみる。
−−−−−−−−
0000 0011(2)
0000 0110(2)
0000 1100(2)
0001 1000(2)
0011 0000(2)
0110 0000(2)
1100 0000(2)
+)1000 0000(2)
−−−−−−−−−
(c)1111 1101(2) 答えは…-3。同じ答えが返ってきました。
小数×小数の計算等はまた今度。これも整数部分については左シフト。小数部分については右シフトが成り立つと思いますが、
もう〜早い話紙に書いた方が良いですね! NESの使い方も忘れた頃なので、暇があったら検証していきましょう。
実数 | 整数部 | 小数部 |
指数(その数だけシフト) | bit7(27) | bit6(26) | bit5(25) | bit4(24) | bit3(23) | bit2(22) | bit1(21) | bit0(20) | bit7(2-1) | bit6(2-2) | bit5(2-3) | bit4(2-4) | bit3(2-5) | bit2(2-6) | bit1(2-7) | bit0(2-8) |
各桁の重み | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 | 0.5 | 0.25 | 0.125 | 0.0625 | 0.03125 | 0.015625 | 0.0078125 | 0.00390625 |