小数点の表現

 オーバーフロービットは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)
各桁の重み12864321684210.50.250.1250.06250.031250.0156250.00781250.00390625
inserted by FC2 system