[記事公開日]2014/12/03
[最終更新日]2016/11/26

基本情報技術者試験 1-3(補数)

 

 

コンピュータは「引き算」も「足し算」として計算します。

 

そ、そうなのか・・・(笑)

 

簡単に言うと、「3-1=2」のところを、

 

「3+[-1]=2」と計算するということです。

 

簡単ですね。

 

ここでは、

「1の補数」

「2の補数」

 

という言葉を覚えましょう。

 

「1の補数」

ビットを反転させるだけ

 

「2の補数」

ビットを反転させて、+1する。

 

<例>
2進数4ビット「0101」の場合

【1の補数】
1010

(逆にしているだけ)

【2の補数】
1011

(逆にして、+1しているだけ。)

 

2進数には、「1の補数」と「2の補数」があります。

 

同じように、

8進数には「8の補数」と「7の補数」があります。

10進数には「10の補数」と「9の補数」があります。

 

n進数に対して、「nの補数」と、「n-1の補数」がある、ということです。

 

それぞれどんなときに使うのか?

 

nの補数

その数をケタ上がりにするときに使う

 

n-1の補数

そのビット数で絶対値求めるときに使う

 

<例>

2進数で、2の補数「10101110」の絶対値は?

 

 

反転し、+1すれば、「2の補数」になるということは先ほど学びました。

 

なので、この「2の補数」をもう一度「2の補数」にしてしまいましょう。

(反転させ、+1する)

 

すると、元のビットパターンに戻ります。

 

10101110

01010001

01010010(82)

 

 

では、引き算を使わずに足し算だけで計算するとは、具体的にどういうことでしょうか。

 

既に述べたとおり、コンピュータは「0」と「1」だけで何かを作業します。

 

そこで、ビットパターンの先頭を符号のサインにしてしまいます。

 

先頭が「0」ならプラス、

先頭が「1」ならマイナスにするということです。

※実際にそうなっている

 

最上位ビットが0なら、正数。

最上位ビットが1なら、負数になる。

 

このことを覚えましょう。

 

例えば、

2進数「11111111」は、10進数にすると255です。

(2+4+8+16+32+64+128)

 

そして、先頭ビットを符号ビットにするとします。

 

残りの7ビットで数字を表すことになります。

 

2進数で7ビットでは、

 

「-127~-1」と「0」と「1~127」を現せることができます。

 

「10000000」なら「-127」になり、

「01111111」なら「+127」になります。

 

※ややこしいのですが、「11111111」が「-127」ではありません。

 

もし、「10010010」がマイナスいくつなのかを知りたければ、2の補数を使って計算するしかありません。

 

十進法

 

他の問題も見てみます。

 

●10進数「-5.625」を、2進数8ビットの負数で表せ。

 

・正数で2進数にする

0101 . 101 (空きスペースは0で補完する)

 

・2の補数にする(反転させて、+1する)

1010 . 010 (反転させる)
1011 . 010 (+1をする)  ←答え

 

●10進数「-100」の”符号”をとるといくつになるか?

10進数・・・100

2進数・・・01100100

2の補数・・・10011100

 

最上位ビット「1」はマイナスの意味だが、今回は全て正数とみなすということ。

 

答え⇒156

 

●最小値を求める
「2進数8ビットの最小値は?」

 

・最大値を考える 0111 1111 (+127)

 

・最小値は最大値を反転させる。 1000 0000 (-128)

 

以上です。

 

yamatunes