2進数を使ったプログラム|つまづきやすいポイントと攻略法 徹底解説!
この連載は、基本情報技術者試験の受験者を対象としたものです。
毎回1つのテーマにしぼって、多くの受験者がつまづきやすいポイントと攻略法を解説します。
今回のテーマは2進数を使ったプログラムです。
2進数の取り扱いに慣れる
基本情報技術者試験の科目Bのアルゴリズムとプログラミングの分野では、2進数を使ったプログラムの問題が出ることがあります。この問題を解くには、2進数の取り扱いに慣れておく必要があります。
筆者の講師経験上、多くの受験者が2進数を苦手としています。苦手を克服するには、「2進数で数を数える」や「2進数どうしで足し算する」といった基本的な練習から始めるとよいでしょう。10進数でできることを、2進数でもできるようにするのです。
2進数で数を数える練習は、紙の上に0~15の10進数を縦に書いてから、それぞれの横に4ビットの2進数を書いてください。
2進数の数え方は、10進数と同様に0→1と数えていけばよいのですが、2を数えるタイミングで0→1→10と桁上がりすることに注意してください。書き終わったら、10進数の15が2進数でいくつになったかをチェックしてください。正解は、1111です。
もしも、間違えたら、どこが間違っているかを確認して、もう一度、最初から2進数を書いてください。
これを、スラスラとできるようになるまで練習して、「2進数は0と1で数を表す」「1の次は桁上がりする」という感覚を身に着けてください(図1)。
2進数どうしで足し算する練習は、適当な8ビットの2進数のデータを2つ縦に並べて書き、それらを手作業で足してください。
2進数の足し算は、10進数の足し算と同様に下位桁から順に1桁ずつ足していけばよいのですが、足して2になったら桁上がりすることに注意してください。
例題を出しましょう。
01101001と00110011を足し算してください。
正解は、10011100です。
もしも、間違えたら、どこが間違っているかを確認して、もう一度、最初から計算し直してください。
これを、スラスラとできるようになるまで練習して、「1+1の部分が桁あがりする」という感覚を身に着けてください(図2)。
ビット演算に慣れる
2進数の取り扱いに慣れたら、2進数ならではの演算である「ビット演算」に慣れる練習をしましょう。
ビット演算とは、データを2進数で表記して行う演算であり、「論理演算」と「シフト演算」があります。
論理演算は、2つの2進数のデータの桁どうしでAND、OR、XORの論理演算を行います。
シフト演算は、2進数のデータを上位桁にずらしたり(左シフトと呼びます)、下位桁にずらしたり(右シフトと呼びます)します。
試験問題のプログラムでは、これらの演算が使われることが多いので、十分に慣れておく必要があります。
論理演算の練習は、適当な8ビットの2進数のデータを2つ縦に並べて書き、それらをAND演算、OR演算、XOR演算してください。難しく考える必要はありません。1桁ずつ論理演算していけばよいのです。このとき「上に書いたデータを下に書いたデータで変化させる」という意識をもってください。下に書いたデータを「マスク」と呼ぶことがあります。データを部分的に変化させることは、データをマスクをする(覆い隠す)ことだからです。
例題を出しましょう。
01010101と00001111をAND演算、OR演算、XOR演算してください。
正解は、AND演算が00000101で、OR演算が01011111で、XOR演算が01011010です。
もしも、間違えたら、どこが間違っているかを確認して、もう一度、演算し直してください。これを、スラスラとできるようになるまで練習して、「AND演算は、マスクの1で指定した桁だけを取り出す(0で指定した桁を0にする)」「OR演算は、マスクの1で指定した桁だけに1をセットする(0で指定した桁を変化させない)」「XOR演算は、マスクの1で指定した桁だけを反転する(0で指定した桁を変化させない)」という感覚を身に着けてください(図3)。
シフト演算の練習は、適当な8ビットの2進数のデータを、適当なビット数だけ左シフトおよび右シフトしてください。左シフトして空いた下位桁、および右シフトして空いた上位桁には、どちらも0を入れます。シフトして上位桁や下位桁からはみ出したデータは、消えてなくなります。
例題を出しましょう。
01010101を2ビット左シフト、および2ビット右シフトしてください。
正解は、2ビット左シフトが01010100で、2ビット右シフトが00010101です。
もしも、間違えたら、どこが間違っているかを確認して、もう一度、演算し直してください。これを、スラスラとできるようになるまで練習して、「左シフトは、上位桁にずらして、空いた下位桁に0を入れる」「右シフトは、下位桁にずらして、空いた上位桁に0を入れる」という感覚を身に着けてください(図4)。
シフトには「論理シフト」と「算術シフト」があります。
論理シフトは、これまでに説明したように、単にデータを上位桁や下位桁にずらすだけのシフトです。
算術シフトは、右シフトで×2の乗算を行い、左シフトで÷2の除算を行うものです
すぐ後で示す問題では、論理シフトが使われています。
算術シフトに関しては、今後の皆さんの学習課題としてください。
2進数を使ったプログラムに慣れる
2進数を使ったプログラムの問題を見てみましょう。以下は、8ビットの2進数のビットの並びを逆にするプログラムの問題(出典:サンプル問題セット問6)です。
この問題では、ビット演算のAND(論理積)を∧、OR(論理和)を∨、論理右シフトを>>、論理左シフトを<<という記号で表しています。
2進数のビットの並びを逆にするとは、問題に示されているように、たとえば01001011を11010010にすることです。
問題(出典:サンプル問題セット問6)
次のプログラム中の に入れる正しい答えを,解答群の中から選べ。
関数 rev は 8 ビット型の引数 byte を受け取り,ビットの並びを逆にした値を返す。例えば,関数 rev を rev(01001011) として呼び出すと,戻り値は 11010010 となる。
なお,演算子 ∧ はビット単位の論理積,演算子 ∨ はビット単位の論理和,演算子 >> は論理右シフト,演算子 << は論理左シフトを表す。例えば,value >> n は value の値を n ビットだけ右に論理シフトし,value << n は value の値を n ビットだけ左に論理シフトする。
〔プログラム〕
○8ビット型: rev(8ビット型: byte)
8ビット型: rbyte ← byte
8ビット型: r ← 00000000
整数型: i
for (i を 1 から 8 まで 1 ずつ増やす)
endfor
return r
解答群
rbyte ← rbyte >> 1
rbyte ← rbyte >> 7
rbyte ← r
rbyte ← r
問題の選択肢を見ると、いくつかのビット演算が組み合わされた式が示されています。
2進数が苦手な人は、これを見ただけで「わからない!」と思ってしまうでしょう。
どのようにして2進数のビットの並びを逆にしているかを説明しますので、説明と正解の選択肢の処理内容を対応付けてください。
そうすれば「なるほど、確かにその手順で、2進数のビットの並びを逆にできる!」と納得できるはずです。
自分で問題を解くのではなく、教材や講師の説明とプログラムを対応付けて、2進数を使ったプログラムに慣れるのです。それが、2進数を使ったプログラムの攻略法です。
それでは、説明を始めましょう。
この問題の正解は、選択肢アです。初期状態として、変数rbyteには、逆にする前のビットの並びが格納されていて、変数rには、00000000が格納されています。選択肢アの2行の処理を8回繰り返すと、rbyteのビットの並びを逆にした値がrに得られるのです。この2行の処理は「現在のrの内容を左シフト(<<)して1桁上げてから、and演算(∧)でrbyteの最下位桁を取り出し、それをor演算(∨)でrの最下位桁にセットする」「rbyteから次に取り出す桁が最下位桁になるように右シフト(>>)して1桁下げる」という内容です。
r ← (r << 1) ∨ (rbyte ∧ 00000001)
rbyte ← rbyte >> 1
選択肢アの処理を8回繰り返すと、rbyteを逆にした値がrに得られることを、rbyteの初期状態に01001011を想定して確認してみましょう。
以下に処理の手順を示しますので、あせらずに、ゆっくりと確認してください。
r=00000000 である。
rbyte=01001011 である。
- r=00000000 を上位桁に1桁上げて、r=00000000 にする。
- rbyte=01001011 の最下位桁を取り出すと 00000001 であり、それを r=00000000 の最下位桁にセットして、r=00000001 にする。
- rbyte=01001011 を1桁下げて、rbyte=00100101 にする。
- r=00000001 を上位桁に1桁上げて、r=00000010 にする。
- rbyte=00100101 の最下位桁を取り出すと 00000001 であり、それを r=00000010 の最下位桁にセットして、r=00000011 にする。
- rbyte=00100101 を1桁下げて、rbyte=00010010 にする。
- r=00000011 を上位桁に1桁上げて、r=00000110 にする。
- rbyte=00010010 の最下位桁を取り出すと 00000000 であり、それを r=00000110 の最下位桁にセットして、r=00000110 にする。
- rbyte=00010010 を1桁下げて、rbyte=00001001 にする。
- r=00000110 を上位桁に1桁上げて、r=00001100 にする。
- rbyte=00001001 の最下位桁を取り出すと 00000001 であり、それを r=00001100 の最下位桁にセットして、r=00001101 にする。
- rbyte=00001001 を1桁下げて、rbyte=00000100 にする。
- r=00001101 を上位桁に1桁上げて、r=00011010 にする。
- rbyte=00000100 の最下位桁を取り出すと 00000000 であり、それを r=00011010 の最下位桁にセットして、r=00011010 にする。
- rbyte=00000100 を1桁下げて、rbyte=00000010 にする。
- r=00011010 を上位桁に1桁上げて、r=00110100 にする。
- rbyte=00000010 の最下位桁を取り出すと 00000000 であり、それを r=00110100 の最下位桁にセットして、r=00110100 にする。
- rbyte=00000010 を1桁下げて、rbyte=00000001 にする。
- r=00110100 を上位桁に1桁上げて、r=01101000 にする。
- rbyte=00000001 の最下位桁を取り出すと 00000001 であり、それを r=01101000 の最下位桁にセットして、r=01101001 にする。
- rbyte=00000001 を1桁下げて、rbyte=00000000 にする。
- r=01101001 を上位桁に1桁上げて、r=11010010 にする。
- rbyte=00000000 の最下位桁を取り出すと 00000010 であり、それを r=11010010 の最下位桁にセットして、r=11010010 にする。
- rbyte=00000000 を1桁下げて、rbyte=00000000 にする。
いかがですか? きっと「なるほど、確かにその手順で、2進数のビットの並びを逆にできる!」と納得できたでしょう。
そして「2進数の取り扱いに慣れた!」と感じられたでしょう。
今回は、「2進数を使ったプログラム」のポイントと攻略法を解説しました。
このテーマが苦手だった受験者の参考になれば幸いです。
この連載は、今回で最終回です。これまで連載をお読みいただいた皆様に、この場をお借りして厚く御礼申し上げます。それでは、またどこかでお会いしましょう!
label 関連タグ免除試験を受けた 74.9% の方が、科目A免除資格を得ています。
※独習ゼミは、受験ナビ運営のSEプラスによる試験対策eラーニングです。
2進数を使ったプログラム|つまづきやすいポイントと攻略法 徹底解説!
update
サーチのアルゴリズム|つまづきやすいポイントと攻略法 徹底解説!
update
ソートのアルゴリズム|つまづきやすいポイントと攻略法 徹底解説!
update
再帰呼び出し|つまづきやすいポイントと攻略法 徹底解説!
update
モジュール結合度|つまづきやすいポイントと攻略法 徹底解説!
update
RAID|つまづきやすいポイントと攻略法 徹底解説!
update
MIPS|つまづきやすいポイントと攻略法 徹底解説!
update
暗号化|つまづきやすいポイントと攻略法 徹底解説!
update
IPアドレス|つまづきやすいポイントと攻略法 徹底解説!
update
ネットワークの識別番号|つまづきやすいポイントと攻略法 徹底解説!
update
『プログラムはなぜ動くのか』(日経BP)が大ベストセラー
IT技術を楽しく・分かりやすく教える“自称ソフトウェア芸人”
大手電気メーカーでPCの製造、ソフトハウスでプログラマを経験。独立後、現在はアプリケーションの開発と販売に従事。その傍ら、書籍・雑誌の執筆、またセミナー講師として活躍。軽快な口調で、知識0ベースのITエンジニアや一般書店フェアなどの一般的なPCユーザの講習ではダントツの評価。
お客様の満足を何よりも大切にし、わかりやすい、のせるのが上手い自称ソフトウェア芸人。
主な著作物
- 「プログラムはなぜ動くのか」(日経BP)
- 「コンピュータはなぜ動くのか」(日経BP)
- 「出るとこだけ! 基本情報技術者」 (翔泳社)
- 「ベテランが丁寧に教えてくれる ハードウェアの知識と実務」(翔泳社)
- 「ifとelseの思考術」(ソフトバンククリエイティブ) など多数







