IT初心者のための 2進数 入門 ~ 基本情報ではじめるコンピュータ科学の基礎理論(2)


2023-06-14 更新

この連載は、これから IT の勉強をはじめる人を対象としたものです。 基本情報技術者試験の出題分野ごとに、仕組み、主要な用語、および過去問題を紹介します。 受験対策としてだけでなく、 IT の基礎知識を幅広く得るために、ぜひお読みください。

今回は、「コンピュータ科学の基礎理論」その 2 として「 2 進数」の分野を取り上げます。

2 進数のポイント

2 進数は、 0 と 1 だけを使って数を数える方法です。 0 、 1 と数えたら、 2 を数えるタイミングで 10 に桁上がりします。 10 は、「じゅう」ではなく、「イチ・ゼロ」と読みます。 10 の後は、 11 (イチ・イチ)、 100 (イチ・ゼロ・ゼロ)、101 (イチ・ゼロ・イチ)、 ・・・ 、と数えていきます。

コンピュータの内部では、あらゆるデータを 2 進数で取り扱っています。 ユーザーが 10 進数で入力したデータは、コンピュータの内部で 2 進数に変換されているのです。

 

それでは、なぜコンピュータの内部では、 2 進数が使われているのでしょうか? それは、 2 進数は、 10 進数よりシンプルだからです。

コンピュータの内部では、電気でデータを表わしています。 1 本の電線で 1 桁の数を伝えています。 もしも、 1 桁が 0 ~ 9 の 10 進数を使ったら、 1 本の電線の電圧(電気の強さ)を 0 ~ 9 の 10 段階に変化させなければなりません。 これは、実現が困難であり、間違いも生じやすくなります。

それに対して、 2 進数を使えば、 1 桁が 0 と 1 だけなので、電圧を 2 段階に変化させるだけで済みます。 たとえば、電圧が 0 V (ボルト)なら 0 を表し、 5 Vなら 1 を表す、というようにするのです。 これなら、実現が容易であり、間違いも生じにくくなります。

  • コンピュータの内部で 2 進数が使われていること
  • 1 本の電線で 1 桁の 2 進数を表していること

これらが 2 進数を理解する上での重要なポイントです。

さらに、コンピュータの内部にある電線の本数が有限であることにも注意してください。

たとえば、コンピュータの内部で、 32 本の電線でデータを伝えているなら、 32 桁を超えたデータは取り扱えません。 CPU (プロセッサとも呼びます)やメモリなどのディジタル IC の中にあるデータ格納領域のサイズも有限です。 たとえば、 CPU の内部にあるデータ格納領域(レジスタと呼びます)のサイズが 32 桁なら、 32 桁を超えたデータは取り扱えません。

2 進数の主要な用語

用語ビット
ビット( bit = binary digit )は、 2 進数の 1 桁という意味です。 1 ビットは、電線 1 本で表せる 0 または 1 のデータです。
ビット数( 2 進数の桁数)が増えれば、表せるビットパターン(データの数)が増えます。 たとえば、
2 ビットでは、 00 、 01 、 10 、 11 の 4 個のビットパターン、
3 ビットでは 000 ~ 111 の 8 個のビットパターン、
4 ビットでは 0000 ~ 1111 の 16 個のビットパターンを表せます。
1 ビット増えるごとに、表せるビットパターンの個数は 2 倍になります。
用語バイト
バイトは、「かじる」という意味の bite をもじった造語であり、 byte と表記します。
バイトは、 2 進数の 8 桁( 8 ビット)をひとまとまりとして扱うための単位です。 1 バイト = 8 ビットです。 これは、 12 本の鉛筆を 1 ダースと呼ぶことに似ています。
1 バイト = 8 ビットで表せるビットパターンは 00000000 ~ 11111111 の 256 個です。
用語2 の補数表現
コンピュータの内部では、電圧の高低で 0 と 1 を表しています。 0 と 1 だけなので、たとえば電線が 8 本なら 00000000 ~ 11111111 ( 10 進数で 0 ~ 255 )のデータを表せますが、これではマイナスの数を表せません。 そのため、マイナスの数を表す場合には、特殊なデータ表現を使う必要があります。
2 の補数表現は、マイナスの数を表すための特殊なデータ表現の一種です。
用語符号ビット
2 の補数表現では、最上位桁が 0 ならプラスの数(ゼロもプラスに含めます)とし、最上位桁が 1 ならマイナスの数とします。 この最上位桁のことを符号ビットと呼びます。 プラスかマイナスかを判断するビットだからです。
たとえば、 8 ビットの場合には、
最上位桁が 0 の
00000000 ~ 01111111
がプラスの数( 10 進数で 0 ~ 127 )を表し、
最上位桁が 1 の
11111111 ~ 10000000
がマイナスの数( 10 進数で -1 ~ -128 )を表します。
用語8 進数と 16 進数
2 進数のデータは、 01011011 のように 0 と 1 だけなので、見た目にわかりにくいものです。 そこで、 2 進数の代用表現として 8 進数や 16 進数が使われることがあります。 2 進数の 3 桁は 8 進数の 1 桁にピッタリ一致し、 2 進数の 4 桁は 16 進数の 1 桁にピッタリ一致するので、相互に変換しやすいからです。
2 進数の 000 ~ 111 は、 8 進数の 0 ~ 7 になります。
2 進数の 0000 ~ 1111 は、 16 進数の 0 ~ F になります。 16 進数では、 10 進数の 10 ~ 15 も 1 桁なので、それら を A ~ F で表します
2 進数の
01011011
を 8 進数に変換すると、下位桁から 3 桁ずつ区切って
01 011 011
とし、それぞれを 1 桁に変換して
133
になります。
同じ 2 進数の
01011011 を 16 進数に変換すると、下位桁から 4 桁ずつ区切って
0101 1011
とし、それぞれを 1 桁に変換して
5B
になります。

2 進数の演算(ビット演算)

2 進数のデータは、 10 進数と同等に加減乗除の算術演算ができますが、 2 進数ならではの「ビットごとの論理演算」および「シフト演算」という演算もあり、これらを「ビット演算」と呼びます。

ビットごとの論理演算

ビットごとの論理演算では、 2 つのデータの同じ桁どうしで ANDORXOR の論理演算を行います。

AND 演算
桁の数が両方とも 1 のときだけ演算結果が 1 になり、それ以外は 0 になります(図 1 の looks_one )。
OR 演算
桁の数のどちらかが 1 のときに(両方が 1 でも OK です)演算結果が 1 になり、それ以外は 0 になります(図 1 の looks_two )。
XOR 演算
桁の数が不一致( 0 と 1 、または 1 と 0 )のときに演算結果が 1 になり、それ以外( 0 と 0 、または 1 と 1 )は 0 になります(図 1 の looks_3 )。
図 1 ビットごとの論理演算の例
looks_one AND 演算
    01010101
AND 00001111
――――――――――――
    00000101 ・・・演算結果
looks_two OR 演算
    01010101
OR  00001111
――――――――――――
    01011111 ・・・演算結果
looks_3 XOR 演算
    01010101
XOR 00001111
――――――――――――
    01011010 ・・・演算結果

シフト演算

シフト演算のシフト( shift )とは、桁を「ずらす」という意味です。
上位桁にずらすことを「左シフト」と呼び、
下位桁にずらすことを「右シフト」と呼びます。
コンピュータの電線の数やデータ格納領域のサイズは有限なので、シフトしてはみだした桁は失われます(消えてなくなります)。

論理シフト
単純に桁をずらすだけのシフトです。 論理シフトでは、すべての桁をシフトし、左シフトで空いた下位桁と右シフトで空いた上位桁には 0 を入れます(図 2 の looks_onelooks_two )。
算術シフト
左シフトで乗算を行い、右シフトで除算を行うシフトです。 1 桁左シフトすると値は 2 倍( × 2 )になり、 1 桁右シフトすると値は 1 / 2 倍( ÷ 2 )になります。
算術シフトでは、最上位桁の符号ビット以外の桁をシフトし、左シフトで空いた下位桁には 0 を入れ、右シフトで空いた上位桁には符号ビットと同じ値を入れます。 こうすることで、符号を変えずに適切な乗算や除算結果が得られます(図 2 の looks_3looks_4
図 2 シフト演算の例
looks_one 1 桁だけ論理左シフトする
    11110000 ・・・シフト前
    11100000 ・・・シフト後
looks_two 1 桁だけ論理右シフトする
    11110000 ・・・シフト前
    01111000 ・・・シフト後
looks_3 1 桁だけ算術左シフトする
    11110000 ・・・シフト前
    11100000 ・・・シフト後
looks_4 1 桁だけ算術右シフトする
    11110000 ・・・シフト前
    11111000 ・・・シフト後

2 進数の過去問題

2 進数の分野の過去問題を 3 問ほど紹介しましょう。

ビットパターンの個数に関する問題

最初は、ビットパターンの個数に関する問題です。

問 4 平成 28 年度 秋期

32 ビットで表現できるビットパターンの個数は, 24 ビットで表現できる個数の何倍か。

ア 8  イ 16  
ウ 128  エ 256

32 ビットで表現できるビットパターンは 232 個であり、 24 ビットで表現できるビットパターンは 224 個です。 両者に何倍の差があるかは、

232 ÷ 224 = 232 - 24 = 28 = 256

いう計算を行えばよいのですが、指数計算のやり方(ここでは、除算が指数の減算になること)を忘れてしまったという人もいるでしょう。 その場合には、こう考えてください。

ビット数が 1 増えると、表現できるビットパターンは 2 倍になります。 32 ビットは 24 ビットより 8 ビット多いので、
2 倍の 2 倍の 2 倍の 2 倍の 2 倍の 2 倍の 2 倍の 2 倍( 2 倍を 8 回)
で、
2 倍 → 4 倍 → 8 倍 → 16 倍 → 32 倍 → 64 倍 → 128 倍 → 256 倍
になります。

したがって、選択肢エが正解です。

シフト演算に関する問題

次は、シフト演算に関する問題です。 この問題を解くには、 2 進数と 16 進数を変換する知識も必要です。

問 2 平成 25 年度 秋期

32 ビットのレジスタに 16 進数 ABCD が入っているとき, 2 ビットだけ右に論理シフトした値はどれか。

ア 2AF3  イ 6AF3  
ウ AF34  エ EAF3

レジスタとは、 CPU の中にあるデータ格納領域のことです。 32 ビットのレジスタとは、レジスタのサイズが 32 ビットということです。

16 進数の ABCD を 2 進数に変換すると

1010 1011 1100 1101 (わかりやすいように4ビットずつ区切っています)

になります。
このデータを 2 ビットだけ右に論理シフトするのですから、下位の 2 ビットの

1010 1011 1100 1101

の部分がレジスタからはみ出して(はみ出した 01 は消えます)、空いた上位 2 ビットに 00 が入れられて(論理シフトでは空いた桁に 0 を入れます)

00 1010 1011 1100 11

になります。
このデータを 4 ビットずつ区切ると

0010 1010 1111 0011

になり、それぞれを 16 進数に変換すると

2 A F 3

になります。

したがって、選択肢アが正解です。

ビットごとの論理演算に関する問題

最後は、ビットごとの論理演算に関する問題です。 一つ前の問題と同様に、この問題を解くには、 2 進数と 16 進数を変換する知識も必要です。

問 2 平成 31 年度 春期

最上位をパリティビットとする 8 ビット符号において,パリティビット以外の下位 7 ビットを得るためのビット演算はどれか。

16 進数 OF との AND をとる。
16 進数 OF との OR をとる。
16 進数 7F との AND をとる。
16 進数 FF との XOR (排他的論理和)をとる。

パリティビットとは、データの誤りを検出するために付加されるビットです。 ここでは、 8 ビット符号の最上位がパリティビットなので、残りの 7 ビットがデータの値です。 パリティビット以外の下位 7 ビットを得るには、パリティビットの位置を 0 にして、残りの 7 ビットの値を変化させないビット演算をすることになります。

そのためには、最上位桁を 0 にして残りの 7 ビットを 1 にした 01111111 というデータと AND 演算を行います。

01111111 は、最上位桁が 0 なので演算する相手の桁が 0 でも 1 でも、演算結果は 0 になります。
それ以下の 7 桁はすべて 1 なので、演算する相手の桁が 0 なら 0 になり、 1 なら 1 になるので、変化しません。

したがって、 01111111 というデータと AND 演算を行えば、最上位桁を 0 にして、それ以下の 7 桁を変化させないことができます。 これが、下位 7 桁を得るということです。
選択肢は、データが 16 進数で示されています。 01111111 を 16 進数に変換すると、 7F です。

したがって、選択肢ウが正解です。

今回は、「コンピュータ科学の基礎理論」その 2 として「 2 進数」の分野のポイント、主要な用語、演算、および過去問題を紹介しました。

次回は、「コンピュータ科学の基礎理論」その 3 として「論理演算」の分野を取り上げます。

それでは、またお会いしましょう!

label 関連タグ
科目A試験は、
免除できます。
独習ゼミで科目A試験を1年間免除して、科目B試験だけに集中しましょう。
免除試験を受けた 74.9% の方が、
科目A免除資格を得ています。
科目A免除試験 最大 2 回の
受験チャンス !
info_outline
科目A免除試験 最大 2 回の
受験チャンス !
詳しく見てみるplay_circle_filled
label これまでの『基本情報ではじめる IT の勉強』の連載一覧 label 著者