Think Essentially

計算機テクノロジー全般が好きです

【コンピュータシステムの理論と実装】第2章

  • 2bitの足し算は,2種類の加算器で行われる
  • 最下位bit(一番右の桁bit) は2bit加算器で,それ以外の桁は,3bit加算器で計算する
  • なぜなら,最下位bitは桁上がりを考慮する必要がないのに対して,最下位以外のbitは,二つのbit値と,直前のbitの桁上がりを考慮する必要があるから.
  • 桁上がりのbit値はキャリービットという
  • 4bit同士の足し算において,和が5bitになったら,その最上位bitは破棄される

符号付き2進数の表し方 - 2進数のコードを,符号付で表すためには,2nの領域を均等に二つに分ける必要がある.

補数(基数の補数)

補数とは,2進数コードにおける,符号付き整数の表現 この”補数”の語源が非常に興味深い

$notx = 2^n - $x

照明のために 例えば,4bitのある値を-にして,計算すると

x + (-x) = 0

を計算すると,10000となり,オーバーフローの切り捨てで 実質的には0000になる.この1の後に0がn個の続く様子が “補数”の語源となる。

nbit 2進数システムにおける補数表現の性質

  • 正の数の最上位bitは,0
  • 負の数の最上位bitは,1

xから-xを得る方法

方法1:最下位bitから桁を繰り上げてみていき,1が出現するbitに遭遇したら,その次のbitより値を反転させる

ex)

0001 → 1110 // 最下位bitに1があるので,次のbitから反転
0100 → 1000 // 最下位bitから3番目に初めて1から出現するので,次の最上位bitだけ反転

方法2:xの全てのbitを反転させた値に1を足す

まとめ

  • 2の補数を用いることで,単純なbit単位の加算のみで正・負の表現ができる

算術論理演算子 ALU

ALUとは

プリミティブゲートの集合体. 二つの値に対して,あらゆる計算を行うことができる優れもの.

プロジェクト

  • sum → Xorの出力
  • carry → Andの出力
  • あらかじめ変数を計算・用意して,Muxでif分岐,とすると,割とすんなり行ける.
  • 部分的に配列から代入することは出来ない.例えば,以下のような
Mux(a = true, b = false, sel = tmpOut[15], out = zr);
  • 判定の,0にするかどうか? → 反転させるかどうか? という順番に注意.

全てのフラグが1のとき

x → 0000 → 1111
y → 0000 → 1111

となり,この2値を足し合わせて 1110となるから(オーバーbit切り捨て) それを反転させて 0001,つまり10進数の1になる.という箇所が肝.

test

test

test