【基本情報技術者を目指す皆様へ】
・今回は2進数の足し算と引き算について教えます!
・実際にPythonでコンピュータでの計算を行い、疑問の解決につなげます。
コードが知りたい方は目次のソースコードへ飛んでください!
本記事のテーマ
説明
結論!?
「10進数も2進数も変わりません!」(現実世界では)
まずは手で計算してみます。
ただし、コンピュータの世界では引き算という概念がありません!
コンピュータに引き算がない理由!
これは、コンピューターの演算装置の元は半加算器で、これを2つ繋げて全加算器を構成していますが、減算機というものがコンピュータにないからです。
なぜないのかというと、効率の問題で、加算器用の回路と減算機用の回路を作るより加算器用の回路のみで加減算ができるなら、回路の規模が小さくなり、効率が良くなるからです。
では、加算器のみで減算を行うにはどうすればいいのか?
2の補数という概念!
加算器で減算を行うには単純に
2+(−3)= −1
のように負の数を足せば良いのです。
ですので、「正の数と負の数」両方を表現できる方法が必要になりますがそれが「2の補数」なのです。
ただし、以下のような表現では正しく計算できません!
そこで出てくるのが補数という概念です。
補数とは
「その桁数での最大値を得るために補う数」、「次の桁に繰り上がるために補う数」
例:1234という10進数があったとする。
4桁の最大値 いくつ足せば最大値になるかというと
9999 → 9999 ー 1234 = 8765 ← これを「9の補数という」
次の桁に繰り上がる数 いくつ足せば繰り上がるのかというと
10000 → 10000 ー 1234 = 8766 ← これを「10の補数という」
これを2進数に置き換えると、
3桁の最大値 いくつ足せば最大値になるか
111 → 111 ー 001 = 110 ← これが「1の補数」
次の桁に繰り上がる数
1000 → 1000 ー 001 = 0111 ← これが「2の補数」
この2の補数を使って計算してみます。
2の補数による計算
ここで、コンピュータの演算は8ビットとする。
00000101 (5) ←8ビットの2進数
+11111011 (?) ←上の数の2の補数
ーーーーーーーーーーーーー
=100000000 (?)
8ビットの数とその補数を足すと、当たり前ですが桁上がりして9ビットより右は'0'になります。
このコンピュータは8ビットしか計算できないため、9ビット目は破棄されます。
その結果、答えは'0'になります。
つまり、
5 + (−5) = 0
00000101 + 11111011 = 00000000
が実現できました。
2の補数を一回一回計算するのは面倒なため、次のようにすると簡単に求まります。
( 5):00000101 ←全ビットを反転する
11111010 ←それに'1'を加える
(−5) :11111011 ←「2の補数」
3ビットの2進数と10進数の対応表(2の補数)
2進数 | 10進数 |
ーーーーーーーーーー |
000 | 0 |
001 | 1 |
010 | 2 |
011 | 3 |
100 | −4 |
101 | −3 |
110 | −2 |
111 | −1 |
ーーーーーーーーーー |
以上で2進数の足し算と引き算の説明は終了です!
今まで10進数で生きてきたのに急に2真数と言われればびっくりすると思いますが、覚えれば簡単なので一つ一つ覚えて基本情報技術者になりましょう!
最後にPythonで実際に2進数の計算をしてみたいと思います!
Pythonで2進数の足し算と引き算
Code
if __name__ == "__main__" :
a = 0b00000101 # 5
b = 0b00000001 # 1
print ("a :", a)
print ("b :", b)
print("a+b:", a+b)
print ("")
print("2の補数")
a = 0b00000101 # 5
b = ~a + 0b01 # -5
print ("a :", a)
print ("b :", b)
print ("a+b:", a+b)
出力
a : 5
b : 1
a+b: 6
2の補数
a : 5
b : -5
a+b: 0
参考資料
・キタミ式イラストIT塾 基本情報技術者 平成31/01年