秋葉原のスーパージャンクというジャンク屋さんで買ってきた7セグメントLEDは、なんと+記号が表示できます。普通の7セグメントLEDの真ん中に縦に短い二つの追加セグメントがあるのです。ピンを調べてみると、数字としては「1」だけが表示できるようです。ですので、意味のある表示は「+.-.+1,-1」と言ったところですね。
この動画では、同じくスーパージャンクで買ったロータリバイナリスイッチで、4bitで表現できる数字を10進数で表示してみました。2進数では、最上位ビットが符号を表しますので、ロータリバイナリスイッチの「0」は「+0」と表示されます。2進数はマイナスの数は「2の補数」で表現されます。例えば10進数の「1」は2進数の「0001」ですが、10進数の「-1」は2進数の「1111」です。なぜかというと、10進数の「+1」と「-1」を足すと「0」になりますが、2進数の「0001」と「11111」を足すと「10000」となります。一番上の「1」は桁あふれなので無視すると「0000」で「0」だというわけです。と言うことで、計算機は基本的に演算は加算器で実現され、引き算は2の補数で、掛け算は足し算を繰り返すこと、割り算は引き算を繰り返すことで実現されます。
私(町田)は舞鶴高専電子制御工学科3年生に、このような「計算機工学」を教えています。
【小中学生向け夏休みの自由課題】コンピュータ内部での数字表現
●ディジタルとは?
皆さんが使っている、電卓やスマホやパソコンは「電子計算機」の一種です。もちろん、ディジタルの計算機です。
ディジタルとはどういうことかと言うと、(スイッチの)ONとOFFだけで表現するということです。算数(数を数える)では、ONを「1]、OFFを「0」と分かりやすくなります。
●2進数で大きな数を表現する
ただ、0と1だけだと2種類しかないので不便です。大きな数を表すには0と1を並べます。つまり桁を作ります。つまり、「0」の次は「1」、その次は桁上がりして「10」です。注意したいのは「10」は「十(じゅう)」ではなく「イチゼロ」と読みます。これを2進数と言います。普段使っている10進数と2進数の対応関係は次のようになります。
10進数 2進数
0 0
1 1
2 10
3 11
4 100
5 101
6 110
7 111
8 1000
9 1001
10 1010
11 1011
12 1100
13 1101
14 1110
15 1111
ここで、2進数の一桁(ひとけた)をビット(bit)と言います。
もうひとつ気を付けて欲しいのは、あらわる数の範囲です。
1ビットで表せる数は(0,1の)2つ、
2ビットで表せる数は(0,1,2,3の)4つ、
3ビットで表せる数は(0,1,2,3,4,5,6,7の)8つ、と言うように倍倍(ばいばい)になるので、
4ビットで表せる数は16個です。
上の表を良く見ると、最小値は0で、最大値は1ビットなら1、2ビットなら3、3ビットなら7、4ビットなら15、なのですが、2進数ならばそれぞれ、「1」、「11」、「111」、「1111」と全て「1」になっていますね。
●最下位ビットと最上位ビット
さて、2進数で大きな数を表せることが分かりましたが、各桁は一番下(右側から)、第0ビット、第1ビット、第2ビット、第3ビットと数えます(後で取り扱いが楽なので)。
その最下位ビットすなわち第0ビットは、何を意味しているのか分かりますか? 上の表を縦に見ると、最下位ビット(第0ビット)は、0,1,0,1,,, と交互に0と1が変わっていますね。と言うことは10進数との比べてみると、そう!(ポンとひざをたたく)、偶数奇数を表しているのですね(0は偶数だということがこれで分かります。)
それでは最上位ビットは何を表しているのでしょうか? 上の表を良く見てみると分かるのですが、「数の大小」を意味しています。
2ビットならば2以上だと最上位ビット(第1ビット)は1、3ビットならば4以上だと最上位ビット(第2ビット)は1、4ビットならば8以上だと最上位ビット(第3ビット)は1、になって、それ未満は0ですね。
英語では、最上位ビットをMSB(Most Significant Bit)、最下位ビットをLSB(Least Significant Bit)、と言います。
●負(マイナス)の数の表現
それでは負(マイナス)の数は、どうやって表現するかと言うと、2進数はマイナスの数は「2の補数」で表現します。例えば10進数の「1」は(4ビットの)2進数の「0001」ですが、10進数の「-1」は2進数の「1111」です。なぜかというと、10進数の「+1」と「-1」を足すと「0」になりますが、2進数の「0001」と「1111」を足すと「10000」となります。一番上の「1」は桁あふれなので無視すると「0000」で「0」だというわけです。と言うことで、計算機は基本的に演算は加算器で実現され、引き算は2の補数で、掛け算は足し算を繰り返すこと、割り算は引き算を繰り返すことで実現されます。
●補数の作り方
補数と言うのは、足せばその数になると言うことです。
例えば「1の補数」では、
「0」の1の補数は「1」
「1」の1の補数は「0」
です。0は1に、1は0になりますね。これを(0,1の)反転と言います。
では、「2の補数」では、
「0」の2の補数は「2」
「1」の2の補数は「1」
ですね。えっ、ちょっと待ってください。2進数は0か1しかつかえないんだったらダメじゃん!!
なので、「2の補数」は「1の補数」に「1を足す」ことで計算します。
たとえば、「-1」は2の補数表現では、
(1) -1の-(マイナス)をとって+1とする。
(2) 「+1」を4ビットの2進数にすると「0001」です。
(3) 1の補数を計算するために「0001」を反転すると「1110」になり、
(4) 2の補数を計算するために、それに1を加えると 「1111」になります。
---
例題: 4-3 を計算してみる。
4-3は、4+(-3)のことですね。そこで-3の「2の補数表現」を考えてみます。
(1) -3の-(マイナス)をとって+3とする。
(2) 「+3」を4ビットの2進数にすると「0011」です。
(3) 1の補数を計算するために「0011」を反転すると「1100」になり、
(4) 2の補数を計算するために、それに1を加えると 「1101」になります。
それでは4(2進数では0100)と足してみましょう。
4 = 0100
+ (-3) = 1101
---------------
10001
答えの一番上(5桁め、第4ビット)はけたあふれなので無視して4ビットにおさめると、答えは「0001」で「4-3=1」は確かに計算できています。
上の筆算は、初めてだとわかりずらいですが、第0ビットは0と1を足すと答えは1、第1ビットは0と0を足すと答えは0、第2ビットは1と1を足すと答えは桁上がり1と0(つまり10)、そして第3ビット(最上位ビット)は0と1と桁上がりの1を足すと答えは(10)、になります。
このように、ディジタル計算機は基本的に演算は加算器で実現され、引き算は2の補数で、掛け算は足し算を繰り返すこと、割り算は引き算を繰り返すことで実現されます。
私(町田)は舞鶴高専電子制御工学科3年生に、このような「計算機工学」を教えています。
4ビットの2の補数の2進数の10進数の対応関係は次の通りです。
10進数 2進数
0 0000
1 0001
2 0010
3 0011
4 0100
5 0101
6 0110
7 0111
-8 1000
-7 1001
-6 1010
-5 1011
-4 1100
-3 1101
-2 1110
-1 1111
+7 (二進数では0111)です。
+6 (二進数では0110)です。
+5 (二進数では0101)です。
+4 (二進数では0100)です。
+3 (二進数では0011)です。
+2 (二進数では0010)です。
+1 (二進数では0001)です。
+0 (二進数では0000)です。
-1 (十六進数ではF、二進数では1111)です。
-2 (十六進数ではE、二進数では1110)です。
-3 (十六進数ではD、二進数では1101)です。
-4 (十六進数ではC、二進数では1100)です。
-5 (十六進数ではB、二進数では1011)です。
-6 (十六進数ではA、二進数では1010)です。
-7 (十六進数では9、二進数では1001)です。
-8 (十六進数では8、二進数では1000)です。
実は -8 は「例外」なのが良くわかります。絶対値が3ビットでは表せないからですね。数字の7セグメントLEDは3ビットの絶対値表現です。
おまけ、4ビットの2進数から、符号ビットと3ビットの(絶対値の)2進数への変換回路
EDA(Electronics Design Automation)ツール:ディジタル回路設計自動化アプリ、によるシミュレーション結果。EDAはIntel(ALTERA)のQuartusIIです。FPGA(現場で買い替えられる大規模IC)用のEDAツールです。ですから、FPGAに書き込めます。すごくシンプルになるでしょう。
ですから、FPGAに書き込めます。すごくシンプルになるでしょう。でも、もちろんゲートIC(小規模IC)で配線して実現できます。最後はコスト(部品の総価格)、そして面積、納期、いろいろな面から評価しないといけません。