2進数

コンピュータシステムで絶対に知っておかないといけない考え方が2進数です。2進数で正の数も負の数も少数もなんでも表現しないことにはコンピュータで扱うことはできません。

正の数

正の数はわかりやすいと思います。0, 1, 10, 11, 100, 101, 110, 111, 1000, 1001, 1010, 1011, 1100, 1101, 1110, 1111 という感じですね。この書き方は本来考えるべき数字の大きさの考え方が抜けています。

数字の大きさ
日常生活で考える数字とソフトウェアで考える数字で、気をつけないといけないことは、数字の大きさです。日常生活で数字を考えるとき、それはすべて可変長で考えられています。1なら1、1桁の数字です。100なら3桁、高い買い物をするときは100万...

というわけで、まずは4-bitの数値と定義すると、0000, 0001, 0010, 0010, 0011, 0100, 0101, 0110, 0111, 1000, 1001, 1010, 1011, 1100, 1101, 1110, 1111という感じです。

 

負の数

それでは負の数はどうするのか、ということになりますね。基本的には、符号を入れ替えた正の数と負の数を足すと0になる、というのがわかりやすい考え方です。例えば、(+1) + (-1) = 0 というように+1と-1を定義できれば便利です、というか、これ以外の定義だと不便になります。これも4bitで考えるとすると、+1は0001とするのが自然ですね。これに足して0になる数字を考えると、1111が当てはまります。0001+1111=10000となりますが、4bitでは10000は扱えないので一番上の数字は桁あふれして消えてしまい、計算結果は0000となります。同様に、+2を0010とすると、-2は1110とすれば 0010 + 1110 = 10000となって0000になります。

違う考え方をするなら、10000から0010を引いて、1110と考えてもOKです。

 

符号ビット

これまでの考え方を整理すると、0から7が0000から0111です。-8から-1が1000から1111です。最上位ビットに注目すると、最上位ビットが0のときが正の数、1のときが負の数になっています。つまり、最上位ビットがその数値の符号をあらわしていると考えることができます。

 

少数

今まで、少数点は数字の一番右にあると考えてきました。これは、単に人間がそうしているだけで、実はどこにあると考えても問題ありません。(足し算と引き算の場合に限ります)

大切なことは、小数点の位置を固定することです。数値ごとに小数点の位置が変わってしまうと足したり引いたりするのがとても大変になります。固定小数点数と呼ぶこともあります。

例えば.0000というように、少数点の位置を仮定すると.1000はつまり0.5のことになります。ただそれだけです。.0100は0.25のことです。0100+0100=1000です。整数と考えれば4+4=8で、少数と考えれば0.25+0.25=0.5となります。掛け算とか割り算という話になると話は変わってきますが、話が複雑になるのでまたの機会に。

さらに話をややこしくするのは浮動小数点数です。こちらはIEEE754で定められたフォーマットを利用することが一般的です。詳しくはWikipediaに説明がありますが、小規模な組み込みシステムでは計算時間が10倍以上遅くなるので、固定小数点数で計算できるように工夫するのが一般的です。とはいえ、Cortex-M4FはハードウェアでFloating Point Unitを備えていて、浮動小数点数の掛け算が1サイクルでできてしまいます。とはいえ、こちらで紹介したDSP機能的な演算の速度は固定小数点数の方が速いです。

DSP機能
ソフトウェアで何か計算を行う場合、だいたいのことは掛け算と足し算でできています。WikipediaのディジタルフィルタにもFIRフィルタの絵が載っていますが、基本的にはこういう感じです。

コメント