第10回 組合せ論理回路 (3)

オンデマンド受講する場合は、必ず連絡の動画を見てから今回の内容に進んでください。

負の2進数

概要

動画の解説を参照
10進数 2進数
\((7)_{10}\) \((0111)_2\)
\((6)_{10}\) \((0110)_2\)
\((5)_{10}\) \((0101)_2\)
\((4)_{10}\) \((0100)_2\)
\((3)_{10}\) \((0011)_2\)
\((2)_{10}\) \((0010)_2\)
\((1)_{10}\) \((0001)_2\)
\((0)_{10}\) \((0000)_2\)
\((-1)_{10}\) \((1111)_2\)
\((-2)_{10}\) \((1110)_2\)
\((-3)_{10}\) \((1101)_2\)
\((-4)_{10}\) \((1100)_2\)
\((-5)_{10}\) \((1011)_2\)
\((-6)_{10}\) \((1010)_2\)
\((-7)_{10}\) \((1001)_2\)
\((-8)_{10}\) \((1000)_2\)
正・負の区別のある2進数を扱うときは、最上位ビットを符号として扱います。
最上位ビットが 0 なら正、1 なら負です。
4ビットの2進数の場合は -8~7 の値はこのようになります。

負の数に対応する2進数は、同じ大きさの正の2進数の 0 と 1 を反転させ、1 を足せば得られます。
\((6)_{10} = (0110)_2\)

↓ 0, 1 を反転

\((1001)_2\)

↓ 1を足す

\((1010)_2 = (-6)_{10}\)
このような関係にある数どうしを補数 (正確には2の補数) と呼びます。
\((0110)_2\) の補数は \((1010)_2\)、\((1010)_2\) の補数は \((0110)_2\) です。

課題1

※ 準備 : 学籍番号を入れて「入力」をクリック (タップ) してください。


\(A=(\)\()_2\) のとき、\(-A\) を8桁の2進数で書いてください。また、\(A\) を10進数に変換してください。
課題1解説

2進数の引き算

概要

動画の解説を参照

4ビットの2進数 \(A, B\) があるとき、前項で見た方法で \(-B\) を作り、\(A\) と \(-B\) の足し算を行えば \(A-B\) がもとめられます。
例えば
\(A=(5)_{10}=(0101)_2\)
\(B=(3)_{10}=(0011)_2\)
なら、
\(-B=(-3)_{10}=(1101)_2\)
になるので、\(A-B\) はこのようになります。
1 0 1
+ 1 1 0 1
1 1 1
1 0 0 1 0
計算結果のうち下から (右から) 5ビット目の位は無視します。すると \((0010)_2 = (10)_2\)、つまり「5-3 = 2」の計算ができたことになります。
結果が負になる場合でも同様にできます。例えば
\(A=(3)_{10}=(0011)_2\)
\(B=(5)_{10}=(0101)_2\)
なら、
\(-B=(-5)_{10}=(1011)_2\)
になるので、\(A-B\) はこのようになります。
1 1
+ 1 0 1 1
1 1
1 1 1 0
この結果、\((1110)_2\) は負の数で、その補数は \((0010)_2 = (2)_{10}\)、つまり \((1110)_2 = (-2)_{10}\) なので、「3-5 = -2」の計算ができたことになります。
ただし、この方法がうまくいかないこともあります。
\(A=(7)_{10}=(0111)_2\)
\(B=(-4)_{10}=(1100)_2\) → \(-B=(4)_{10}=(0100)_2\)
の場合は、正しい計算結果は「7-(-4) = 11」ですが
で、\(A-B\) は
1 1 1
+ 1 0 0
1
1 0 1 1
となり、\((1011)_2\) は負の数で、その補数は \((0101)_2 = (5)_{10}\)、つまり \((1011)_2 = (-5)_{10}\) で、本来の値とは違う結果になってしまいます。
原因は、本来の計算結果が「符号付き4ビット」で表現できる範囲、つまり -8~7 の範囲外にあるためです。
これをオーバーフローと呼びます。

オーバーフローが起こるかどうかは、繰り上がりの組み合わせでも判定できます。
\(n\) 桁目の計算で起こる繰り上がりを \(C_n\) とすると、オーバーフローの有無はこのようになります。
\(C_3 \backslash C_2\) 0 1
0 なし あり
1 あり なし

課題2

\(A=(\)\()_{10}\), \(B=(\)\()_{10}\) として、 概要の方法で \(A-B\) の計算を行い、普通に10進数の引き算を行った場合と結果を比較して正しいかどうかを確認してください。
課題2解説

引き算を行う回路

動画の解説を参照

前回紹介した加算回路を使えば、引き算を行う回路が作れます。
\(-B\) は \(B\) の 0, 1 を反転させて 1 を加えたものなので、このような回路で A3~A0 に引かれる数、B3~B0 に引く数を設定すれば引き算ができます。

課題3

概要のリンク先の回路を開き、課題2の \(A, B\) に応じて A3~A0, B3~B0 を切り替え、出力 S3~S0 が課題2の計算結果とあっているかどうかを確認し、そのスクリーンショットを撮ってください。
課題3解説

課題

課題解答