はじめに
基本情報技術者試験の勉強に出てくる「補数」。
この概念が分かった上で、いざ計算を解こうとすると「?」が頭に浮かんできました。
そこで、問題が解けるようになるためのワンポイント(自称革新的な理解法)が浮かんだので、それを記事に残します。
それは、補数がどういった時に必要なのか、そのタイミングを理解するということです。
具体的には「補数に変換するタイミングは、負符号(-)と先頭の1ビット符号で、変換するとき」ということを意識して問題を解きます!
それでは詳しく見ていきます。
そもそも補数とは
補数は2進数の引き算をする時、正確には負の数を表現するために用います。
まず、コンピュータは足し算しかできないため、「引き算」ではなく、「負の数」として表現することでこれを解決します。
5-3 は 5+(-3) といった具合です。
"3"は4bitの2進数だと
0011
これを負の数にする時、2の補数に変換します。
1101
本題
では変換のタイミングとはどういうことか。
さきほどの変換を段階に分けて考えてみます。
※()内は進数を表しています。
符号付き2進数から10進数への変換
①1101(2) => ②-011(2) => ③-3(10)
①符号付き2進数
②符号の1を-に変換 かつ 絶対値を2の補数にした値
③絶対値を10進数に変換した値
逆に、10進数から符号付き2進数への変換
④-3(10) ⇒ ⑤-011(2) ⇒ ⑥1101(2)
④10進数
⑤符号を-表記のまま かつ 絶対値を2進数に基数変換した値
⑥符号の-を1に変換 かつ 絶対値を2の補数にした値
赤字に注目すると、符号を変える時に補数が必要になっていることがわかります。
②や⑤のように、もしもパソコンもっと賢くて(?)負符号を表現できるのであれば補数は必要ありません。
あれ?これってさっき話した、
コンピュータは足し算しかできないため、「引き算」ではなく、「負の数」として表現する
と同じですね。
では例題を2つ解いてみましょう。
例題①
5-3(10)を2進数で計算して、また10進数に戻す。ただし4bitで、負数を2の補数で表す。
①引き算を、足し算と負の数で表す。
5-3 => 5+(-3)
②5を2進数に変換する。
5 => 0101
③-3を2進数に変換する。
-3 => -011 => 1101
④足す。
0101 + 1101 = 10010
⑤桁溢れしたbitを切り捨てる。
10010 => 0010
⑤0010を10進数に変換する。
0010 => +010 => 2
よって、答えは 2
例題②
負数を2の補数で表す時、全てのビットが1であるnビットの2進数"1111...11"が表す数値または、その数式は。
ex)
n=4 のとき
1111 => -001 => -1
n=8 のとき
11111111 => -0000001 => -1
よって、どの場合でも-1になるので、答えは -1
おわりに
今回は補数についてまとめてみました。
よくある(私の)勘違いとしては、2進数から10進数にするときのみ補数を用いると理解していることです。
この記事で、「補数に変換するタイミングは、負符号(-)と先頭の1ビット符号で、変換するとき」という理解法が伝われば嬉しいです。
感想
これを書く前は革新的な理解法だ!と思っていましたが、まとめてみると当たり前のことを言っているだけかもしれないな...とも思えてきました笑。
それでも勉強したことを記事にしてアウトプットするという目標を達成できて嬉しく感じています。
また、初めての記事投稿というハードルも乗り越えられました。
今後も学習したことや、自称革新的な理解法を記事にまとめていきます。
よろしくお願いします。