[PR]当サイトはアフィリエイト広告を利用しています。
はじめに
今回はコンピュータでの引き算の話題です。
コンピュータでは基本的に引き算は足し算で処理します。それを可能にするのが
補数
という概念です。補数を覚えれば足し算で引き算ができるようになります。今回は補数の解説と、補数を使った引き算のやり方の解説をします。
基本情報技術者試験などでは補数の計算は必須です。
今回で覚えてしまいましょう。
補数とは
10進数の補数
10進数を例に説明します。10進数には10の補数と9の補数があります。
今11という10進数があったとしましょう。11の
10の補数
は
89です。
11の
9の補数
は
88です。
さて何のことを言っているかという話ですが、元の数と補数を足し算してみましょう。
11と11の10の補数89を足すと
11+89=100
11と11の9の補数88を足すと
11+88=99
もう少し例を挙げると、33の10の補数と9の補数はそれぞれ「67」と「66」になります。
要するに10の補数というのは
足すと元の数の桁数より一つ多い桁が1、それ以外の桁が0になる数
9の補数というのは
足すと元の数の桁数のすべての桁が9になる数
ということです。
10の補数=9の補数+1
という関係があります。
2進数の補数
2進数には2の補数と1の補数があります。
再び10進数の11を考えます。11は二進数で1011です。
1011の1の補数は0100
です。1011+0100=1111となり、元の桁数のすべてのビットが1になります。2進数の1の補数を求めるやり方は簡単です。ビットを全部反転させればよいです。
1011の2の補数は0101
です。1011+0101=10000となり、元の数と2の補数を足すと(元の桁数+1)桁目が1、それ以外は0になります。求め方は1の補数に1を足せばよいです。
補数を足して減算をしてみよう
さて、補数の説明はこのくらいにして実際に足し算で引き算をやってみましょう。
再び11を考えます。
11の10の補数は89でしたね。今23-11を考えます。
23-11=22+(-11)=23+89=112
3桁目を無視すると12ですね。ちゃんと23-11になっています。
2進数でもやってみましょう。23は5桁なので、5桁の11の2の補数(10101)を考えます。桁を合わせないと計算できない点に注意しましょう。
23-11=23+(-11)=10111+10101=101100
6桁目を無視すると01100=12
ちゃんと12になっていますね。
つまり
元の基数と同じ補数(10進数なら10の補数、2進数なら2の補数)を足すと、(元の桁+1)桁目を無視することで減算の結果が得られるということです。
補数を加えると減算ができる仕組み
今2桁のある数xとその補数yがあるとします。
y=100-x
です。これをある数Aに足してみます。
A+y=A+(100-x)=(A-x)+100
これによってA-xが表現されます。またここから100を引くというのは、元の2桁より一桁大きい桁を無視することと同義です。
つまり補数を足して(元の桁数+1)の桁を無視することで、減算ができるということです。
Pythonでちょっと計算してみる
次のコードを実行してください。23-11を2進数で計算してみます。
a=bin(23)
b=bin(11)
print('a',a)
print('b',b)
a=int(a,2)
b=~int(b,2)+0b01
print('b',b)
print('a+b',a+b)
出力は
a 0b10111
b 0b1011
b -11
a+b 12
となります。int()の中にbin()で変換した2進数を入れると数値になって計算できるようになります。2進数なのでint(a,2)の2の部分が2になります。
数値に「~」を付けるとビットを反転します。ビットを反転した数に1を足す、つまり+0b01をすることで負数になります。「~」演算子はもう少し複雑で厳密にはビットを反転してるわけではないのですが、今回はビットを反転しているのと同義です。
そして負数を足すことで減算ができます。
まとめ
今回は補数について解説しました。
補数を足すことで減算が計算できます。コンピュータの中には引き算の回路を直接作ると回路が複雑になるので、補数を活用して足し算のみの回路で単純に減算を計算しています。
コンピュータの仕組みを学んで、ITに強くなりましょう!
当ブログ(シルルスのコードおきば)ではPython入門用の記事を他にも執筆しています。参考になりましたら幸いです。