<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>アルゴリズム問題で半分以上正解できる解き方 | 基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</title>
	<atom:link href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/algorithms_tips/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.seplus.jp/dokushuzemi/ec/fe/fenavi</link>
	<description>基本情報技術者試験を学習する人のためにつくられた専門メディア。250本以上の記事を掲載し、勉強方法や各分野のポイント、過去問解説など、試験に役立つ情報を発信。試験対策書籍を執筆する著者が、はじめて学ぶ人でもわかりやすく解説します。（2023年度からの新制度に対応済み）</description>
	<lastBuildDate>Wed, 20 May 2026 00:42:42 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.9.29</generator>
	<item>
		<title>アルゴリズム問題 2進数がわかれば 50 ％ 以上正解できる「符号付き2進数の乗算」</title>
		<link>https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/algorithms_tips/multiply_binary/</link>
		<pubDate>Fri, 06 May 2022 07:47:11 +0000</pubDate>
		<dc:creator><![CDATA[矢沢 久雄]]></dc:creator>
				<category><![CDATA[2進数]]></category>
		<category><![CDATA[アルゴリズム]]></category>

		<guid isPermaLink="false">https://www.seplus.jp/dokushuzemi/fe/fenavi/?post_type=algorithms_tips&#038;p=6531</guid>
		<description><![CDATA[<p>基本情報技術者試験の受験者の多くは、午後試験のアルゴリズム問題を苦手としています。しかし、その苦手なアルゴリズム問題で、 50 % 以上の正解が得られないと、合格は望めないでしょう。 この連載では、これまでに実施された基 [&#8230;]</p>
<p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/algorithms_tips/multiply_binary/">アルゴリズム問題 2進数がわかれば 50 ％ 以上正解できる「符号付き2進数の乗算」</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>基本情報技術者試験の受験者の多くは、午後試験のアルゴリズム問題を苦手としています。しかし、その<span class="u">苦手なアルゴリズム問題で、 50 % 以上の正解が得られないと、合格は望めない</span>でしょう。</p>
<p>この連載では、これまでに実施された基本情報技術者試験の過去問題を例にして、<span class="bold">最低でも 50 % 正解できる解き方</span>を紹介します。</p>
<p>今回は、平成 22 年度 秋期「符号付き 2 進数の乗算」を取り上げます。</p>
<style>article,pre{font-family:'consolas','Courier New',"HCo Gotham SSm",Gotham,"ヒラギノ角ゴ Pro W3","Hiragino Kaku Gothic ProN","Hiragino Sans","BIZ UDPGothic",Meiryo,sans-serif!important;}pre{position:relative;background:#263238;color:#eceff1;font-size:1em;line-height:1.8;margin:auto -7.5%;padding:1em 7.5%}.number{position:absolute;left:1%;font-size:2em;color:white;}.card-panel>pre{margin:1em -24px;padding:1em 24px}.red-blank{border:.2em solid #e91e63;padding:.25em;}.with-comment{word-break:keep-all;overflow-x:auto;position:relative;}.static-width{width:260px!important;height:auto;}.comment{position:absolute;color:#f44336;left:260px}.symbol{font-size:2em}@media screen and (max-width:600px){pre{padding-left:2.5em}.static-width{width:230px!important;}.comment{left:230px}.symbol{font-size:1.5em}}</style>
<h2>2 進数の取り扱いを習得しておく</h2>
<p>平成 22 年度 秋期「符号付き 2 進数の乗算」の問題を見てみましょう。 以下に、問題と解答へのリンクがありますので、問題にざっと目を通してください。</p>
<table class="responsive-width mag_h30">
<tr>
<th width="50%">平成 22 年度 秋期 午後</th>
<td><a href="https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2010h22_2/2010h22a_fe_pm_qs.pdf#page=34" rel="noopener" target="_blank">問題</a></td>
<td><a href="https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2010h22_2/2010h22a_fe_pm_ans.pdf" rel="noopener" target="_blank">解答</a></td>
</tr>
</table>
<p>基本情報技術者試験の<span class="u">アルゴリズム問題には、 2 進数の知識が必要になる問題が出ることがよくあります</span>。 この問題は、その好例です。</p>
<p>問題には、プログラム 1 とプログラム 2 という 2 つのプログラムが示されていますが、どちらにも<span class="bold">「拡張（符号拡張とも呼びます）」</span>や<span class="bold">「算術シフト」</span>など、 2 進数の取り扱いに関する言葉があります。</p>
<p class="grey-text hide-on-med-and-up mag_h10 small-text"><i class="material-icons light-blue-text mag_rt05">swipe</i>プログラムは横スクロールできます</p>
<div class="card-panel pad_bt00">
〔プログラム 1 〕</p>
<pre>
○プログラム1 (M, N)
○符号付き 2 進整数型： M, N, R
○整数型： L
・M を 5 ビットの符号付き 2 進数に<span class="red-blank">拡張</span>
・N を 8 ビットの符号付き 2 進数に<span class="red-blank">拡張</span>
・R のビット番号 7 ～ 0 に N を複写
・R のビット番号 12 ～ 8 を 0 で初期化
■ L: 1, L ≦ 8, 1
| ▲  R のビット番号 0 のビットが 1
| |・ R のビット番号 12 ～ 8 の内容に M の値を加算
| ▼
|・ R の全 13 ビットを右に 1 ビット<span class="red-blank">算術シフト</span>    /* 空いたビット位置には */
■						/* 符号と同じものが入る */
・return ( R のビット番号 7 ～ 0 の内容)      /* 返却値（括弧内）を返す */<span class="number" style="top:2.7em;">&#10102;</span><span class="number" style="top:3.6em;">&#10103;</span><span class="number" style="top:4.5em;">&#10104;</span><span class="number" style="top:5.4em;">&#10105;</span><span class="number" style="top:7.2em;">&#10106;</span><span class="number" style="top:8.1em;">&#10107;</span><span class="number" style="top:9.9em;">&#10108;</span><span class="number" style="top:11.7em;">&#10109;</span>
</pre>
</div>
<div class="card-panel pad_bt00">
〔プログラム 2 〕</p>
<pre>
○プログラム2 (M, N)
○符号付き 2 進整数型: M, N, R
○整数型: L
・M を 5 ビットの符号付き 2 進整数に<span class="red-blank">拡張</span>
・R のビット番号 4 ～ 1 に N を複写
・R のビット番号 9 ～ 5 及び 0 を 0 で初期化
■ L: 1, L ≦ 4, 1
| ▲ R のビット番号 1 のビットが 0 かつ R のビット番号 0 のビットが 1
| | ・R のビット番号 9 ～ 5 の内容に M の値を加算
| ▼
| ▲ R のビット番号 1 のビットが 1 かつ R のビット番号 0 のビットが 0
| | ・R のビット番号 9 ～ 5 の内容から M の値を減算
| ▼
| ・R の全 10 ビットを右に 1 ビット<span class="red-blank">算術シフト</span> /* 空いたビット位置には */
■                                         /* 符号と同じものが入る */
・return( R のビット番号 8 ～ 1 の内容 ) /* 返却値(括弧内)を返す */<span class="number" style="top:2.7em;">&#10102;</span><span class="number" style="top:3.6em;">&#10103;</span><span class="number" style="top:4.5em;">&#10104;</span><span class="number" style="top:5.4em;">&#10105;</span><span class="number" style="top:7.2em;">&#10106;</span><span class="number" style="top:8.1em;">&#10107;</span><span class="number" style="top:9.9em;">&#10108;</span><span class="number" style="top:11.7em;">&#10109;</span><span class="number" style="top:13.5em;">&#10110;</span>
</pre>
</div>
<p>午前試験と午後試験を含めて、基本情報技術者試験の問題を解くために必要とされる2進数の知識には、以下に示したものがあります。ここでは、それぞれの説明をしませんが、もしも知らないものがあれば、教材を参照して習得しておきましょう。</p>
<ul class="background c-round bold">
<span class="post-title"><i class="material-icons mag_rt05">bookmark</i>基本情報技術者試験に必要な 2 進数の知識</span></p>
<li>10 進数と 2 進数の変換</li>
<li>2 進数と 16 進数の変換</li>
<li>2 の補数表現</li>
<li>拡張（符号拡張）</li>
<li>論理シフトと算術シフト</li>
<li>マスク演算</li>
<li>固定小数点数と浮動小数点数</li>
</ul>
<h2>説明の番号と対応付ける（設問 1 の空欄 a 、 b 、 c ）</h2>
<p>基本情報技術者試験のアルゴリズム問題には、<span class="u">アルゴリズムの説明に番号が示されていて、それとプログラムを対応付ければ解けるという問題が出ることがよくあります</span>。 この問題は、その好例でもあります。</p>
<p>ただし、この問題は、ちょっと変わっています。 擬似言語で示されたプログラムがアルゴリズムの説明になっていて、図に示された手順（具体的なデータを処理する手順）の穴埋めをします。 この穴埋めでは、説明の番号と図に示された番号を対応付けることで、容易に答えを得られます。</p>
<p>以下は、設問 1 の空欄 a と b の答えを得る手順です。 プログラム全体の内容を理解できなくても、手順にしたがってデータを処理すれば、穴埋めができます。</p>
<pre>
| |・ R のビット番号 12 ～ 8 の内容に M の値を加算
| ▼
|・ R の全 13 ビットを右に 1 ビット<span class="red-blank">算術シフト</span>	/* 空いたビット位置には */
■						/* 符号と同じものが入る */<span class="number" style="top:0em;">&#10107;</span><span class="number" style="top:1.8em;">&#10108;</span>
</pre>
<figure class="with-comment">
<img class="materialboxed static-width" src="../../wp-content/uploads/2022/05/figure_h22a_q8.jpg" loading="lazy"><span class="comment" style="top:5.5em;"><span class="symbol">&#10107;</span>の手順に従って加算</span><span class="comment" style="top:8.75em;"><span class="symbol">&#10108;</span>の手順に従って算術シフト（空欄 a ）</span><span class="comment" style="top:13em;"><span class="symbol">&#10107;</span>の手順に従って加算</span><span class="comment" style="top:16.5em;"><span class="symbol">&#10108;</span>の手順に従って算術シフト（空欄 b ）</span><br />
</figure>
<p>以下は、設問 1 の空欄 c の答えを得る手順です。 ここでも、プログラム全体の内容を理解できなくても、手順にしたがってデータを処理すれば、穴埋めができます。</p>
<pre>
| | ・R のビット番号 9 ～ 5 の内容から M の値を減算
| ▼
| ・R の全 10 ビットを右に 1 ビット<span class="red-blank">算術シフト</span> /* 空いたビット位置には */
■                                         /* 符号と同じものが入る */
・return( R のビット番号 8 ～ 1 の内容 ) /* 返却値(括弧内)を返す */<span class="number" style="top:0em;">&#10108;</span><span class="number" style="top:1.8em;">&#10109;</span>
</pre>
<figure class="with-comment">
<img class="materialboxed static-width" src="../../wp-content/uploads/2022/05/figure_h22a_q8_2.jpg" loading="lazy"><span class="comment" style="top:7em;line-height:1.2"><span class="symbol">&#10108;</span>の手順に従って減算<br />11011は、-5なので、00000と00101(5)を加算する</span><span class="comment" style="top:11.5em;"><span class="symbol">&#10108;</span>の手順に従って算術シフト</span><span class="comment" style="top:15.5em;"><span class="symbol">&#10108;</span>の手順に従って算術シフト（空欄 c ）</span><br />
</figure>
<h2>選択肢を見て常識的に判断する（設問 2 の空欄 g ）</h2>
<p>基本情報技術者試験の設問の中には、解答群の選択肢を見て常識的に判断できるものが時々あります。 <span class="u">「えっ！ こんな簡単でいいの？」と言いたくなるような設問</span>です。 この問題の設問 2 の空欄 g は、正にその好例です。</p>
<p>おそらく、空欄 d 、 e 、 f が、かなり難しいので、空欄 g を簡単にしたのでしょう。 以下は、問題と解答群です。</p>
<div class="card-panel">
<ol start="3">
<li>プログラム 1 では， N のビットが 1 の位置で加算をするので，例えば N = 7 ( 2 進数で 0111 ) なら、加算が3回必要である。 一方，プログラム 2 では， N の各ビットを最下位から順に調べ， 1 が現れたけた位置では減算をし、次に 1 の並びが途切れて 0 が現れたけた位置では加算をする，という処理を繰り返す。 例えば N = 7 ( 2 進数で 0111 ) の場合， <span class="red-blank" style="padding:.65em .25em;">M × 7 を M x ( <span class="blank">g</span> ) として計算</span>をするので， 2 進数での加減算の回数が 2 回で済む。</li>
</ol>
<p>g に関する解答群</p>
<p>ア　-2<sup>0</sup> + 2<sup>3</sup><br />
イ　-2<sup>0</sup> + 2<sup>4</sup><br />
ウ　-2<sup>1</sup> + 2<sup>3</sup><br />
エ　-2<sup>1</sup> + 2<sup>4</sup>
</div>
<p>問題をすべて読む必要はありません。</p>
<blockquote>
<p class="grey-text">M × 7 を M x ( <span class="blank">g</span> )として計算</p>
</blockquote>
<p>の部分だけに注目してください。</p>
<p>M × 7 という計算をするのですから、</p>
<blockquote>
<p class="grey-text">M x ( <span class="blank">g</span> )</p>
</blockquote>
<p>の空欄 g には 7 になるものが入るはずです。　その考えで、解答群を見てみましょう。</p>
<p>実際の数値を使った式が示されています。　それぞれを計算すると、以下のように選択肢アだけが　7　になるので、選択肢アが正解です。「えっ！ こんな簡単でいいの？」ですね。</p>
<div class="background c-round">
ア　-2<sup>0</sup> + 2<sup>3</sup> = -1 + 8  = 7  <span class="chip red white-text">正解</span><br />
イ　-2<sup>0</sup> + 2<sup>4</sup> = -1 + 16 = 15<br />
ウ　-2<sup>1</sup> + 2<sup>3</sup> = -2 + 8  = 6<br />
エ　-2<sup>1</sup> + 2<sup>4</sup> = -2 + 16 = 14
</div>
<p>この問題には、設問 1 に空欄 a 、 b 、 c 、設問 2 に空欄 d 、 e 、 f 、 g があり、全部で 7 項目です。ここまでで、 a 、 b 、 c 、 g の 4 項目に正解できたので、それぞれの配点はわかりませんが（午後試験の設問ごとの配点は公開されていません）、きっと 50 % に達したでしょう。</p>
<div class="divider mag_h60 mag_bt30"></div>
<p>今回は、</p>
<ul class="background c-round bold">
<li>「 2 進数の取り扱いを習得しておく」</li>
<li>「説明の番号と対応付ける」</li>
<li>「選択肢を見て常識的に判断する」</li>
</ul>
<p>という解き方を紹介しました。</p>
<p>今後も、この連載では、アルゴリズム問題で最低でも 50 % 正解できる解き方を、あれこれと紹介していきます。 少しでも、皆様の参考になれば幸いです。</p>
<p>それでは、またお会いしましょう！</p><p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/algorithms_tips/multiply_binary/">アルゴリズム問題 2進数がわかれば 50 ％ 以上正解できる「符号付き2進数の乗算」</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></content:encoded>
			</item>
		<item>
		<title>アルゴリズム問題 具体化すれば 50 ％ 以上正解できる「ビットの検査」</title>
		<link>https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/algorithms_tips/check_bit/</link>
		<pubDate>Wed, 06 Apr 2022 02:30:17 +0000</pubDate>
		<dc:creator><![CDATA[矢沢 久雄]]></dc:creator>
				<category><![CDATA[アルゴリズム]]></category>
		<category><![CDATA[テクニック 具体的な値を想定]]></category>
		<category><![CDATA[午後問題の解説]]></category>

		<guid isPermaLink="false">https://www.seplus.jp/dokushuzemi/fe/fenavi/?post_type=algorithms_tips&#038;p=6431</guid>
		<description><![CDATA[<p>基本情報技術者試験の受験者の多くは、午後試験のアルゴリズム問題を苦手としています。しかし、その苦手なアルゴリズム問題で、 50 % 以上の正解が得られないと、合格は望めないでしょう。 この連載では、これまでに実施された基 [&#8230;]</p>
<p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/algorithms_tips/check_bit/">アルゴリズム問題 具体化すれば 50 ％ 以上正解できる「ビットの検査」</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>基本情報技術者試験の受験者の多くは、午後試験のアルゴリズム問題を苦手としています。しかし、その<span class="u">苦手なアルゴリズム問題で、 50 % 以上の正解が得られないと、合格は望めない</span>でしょう。</p>
<p>この連載では、これまでに実施された基本情報技術者試験の過去問題を例にして、<span class="bold">最低でも 50 % 正解できる解き方</span>を紹介します。</p>
<p>今回は、平成 24 年度 春期 問 8 「ビットの検査」を取り上げます。</p>
<style>article,pre{font-family:'consolas','Courier New',"HCo Gotham SSm",Gotham,"ヒラギノ角ゴ Pro W3","Hiragino Kaku Gothic ProN","Hiragino Sans","BIZ UDPGothic",Meiryo,sans-serif!important;}.card-panel{margin:1.5em auto;}pre{position:relative;background:#263238;color:#eceff1;font-size:1em;line-height:1.8;margin:1em -24px;padding:1em 0 1em 24px;}dt{text-align:right;width:5em}dl.inline dd{margin-left:6em}.box-border{position:absolute;padding:2em;border:.2em solid #f06292;}@media screen and (max-width:600px){.width-half-on-large{width:100%}}</style>
<h2>問題に示された具体例を見てプログラムの機能を理解する</h2>
<p>平成 24 年度 春期「ビットの検査」の問題を見てみましょう。 以下に、問題と解答へのリンクがありますので、問題にざっと目を通してください。</p>
<table class="responsive-width mag_h30">
<tr>
<th width="50%">平成 24 年度 春期 午後</th>
<td><a href="https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2012h24_1/2012h24h_fe_pm_qs.pdf#page=35" rel="noopener" target="_blank">問題</a></td>
<td><a href="https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2012h24_1/2012h24h_fe_pm_ans.pdf" rel="noopener" target="_blank">解答</a></td>
</tr>
</table>
<p>この問題の内容は、前半部（設問 1 、設問 2 ）と後半部（設問 3 ）の 2 部構成になっています。</p>
<p>前半部は、 8 ビットの引数 Data の中で、 8 ビットの引数 Mask で指定したビット位置にあるビットの値を検査した結果を返す BitTest 関数です。</p>
<p>後半部は、 8 ビットの引数 Data の中にある 1 の個数を返す BitCount 関数です。</p>
<p>前半部の BitTest 関数のプログラムは、以下に示したように、とてもシンプルであり、プログラムの機能を理解できれば、問題を解けるでしょう。 <span class="u">この前半部で、 50 % の正解を目指す</span>ことにします。</p>
<div class="card-panel pad_bt00">
〔プログラム 1 〕</p>
<p class="grey-text hide-on-med-and-up mag_h10 small-text"><i class="material-icons light-blue-text mag_rt05">swipe</i>プログラムは横スクロールできます</p>
<pre>
○整数型関数 : BitTest (8 ビット論理型: Data, 8 ビット論理型: Mask) 
○整数型: RC         /* 返却値 */
▲ <span class="blank">a</span>
| • RC ← 2         /* 返却値は 2 */
+―――
| ▲ <span class="blank">b</span>
| | • RC ← 0        /* 返却値は 0 */
| +―――
| | • RC ← 1        /* 返却値は 1 */
| ▼
▼
• return RC          /* RC を返却値として返す */
</pre>
</div>
<p>以下は、問題に示された BitTest 関数の説明です。この説明を読んだだけでは、プログラムの機能がよくわかりませんね。</p>
<div class="card-panel">
〔プログラム 1 の説明〕</p>
<p>　整数型関数 BitTest を，次のとおりに宣言する。</p>
<pre>
〇整数型関数 : BitTest (8 ビット論理型: Data, 8 ビット論理型: Mask)
</pre>
<p>　検査される 8 ビットのデータは入力用の引数 Data に，検査をするビット位置の情報は入力用の引数 Mask に，それぞれ格納されている。 Mask 中のビットの値が 1 で あるビット位置に対応した Data 中のビットを検査して，次の返却値を返す。ここで， Mask 中には 1 のビットが 1 個以上あるものとする。</p>
<dl class="inline background c-round">
<dt>返却値 0:</dt>
<dd>検査した全てのビットが 0</dd>
<dt>1:</dt>
<dd> 検査したビット中に 0 と 1 が混在</dd>
<dt>2:</dt>
<dd>検査した全てのビットが 1</dd>
</dl>
</div>
<p>おそらく出題者も「説明だけではわからないだろう」と思ったのでしょう。 そこで、説明の後に、以下の具体例を示しています。</p>
<p>この具体例を見れば、プログラムの機能がわかるはずです。</p>
<div class="card-panel">
　例えば，図 1 の例 1 では， Mask のビット番号 7 ～ 5 の 3 ビットが 1 であるので， Data のビット番号 7 ～ 5 の 3 ビットの値を検査し， 0 と 1 が混在しているので返却値 1 を返す。 例 2 では， Mask のビット番号 4 と 0 の 2 ビットが 1 であるので， Data の ビット番号 4 と 0 の 2 ビットの値を検査し，どちらも 1 であるので返却値 2 を返す。</p>
<figure>
<img class="materialboxed z-depth-5 responsive-width" src="../../wp-content/uploads/2022/04/h24h_q8_figure_1.jpg" loading="lazy"><figcaption>図 1 　BitTest の実行例</figcaption></figure>
</div>
<p>BitTest 関数は、引数 Mask の中にある 1 の位置で、引数 Data をチェックする桁を指定します。 BitTest 関数は、返却値として、チェックする桁が全て 0 なら 0 を返し、 0 と 1 が混在していれば 1 を返し、全て 1 なら 2 を返します。</p>
<p>このように、<span class="u">問題に具体例が示されているときは、それを見れば、短い時間にプログラムの機能を理解できる</span>ようになっています。 問題に具体例があったら<span class="bold">「ヒントだ！」</span>と思ってください。</p>
<h2>選択肢に示された変数に具体的なデータを想定して考える（設問 1 ）</h2>
<p>プログラムの機能を理解できたので、設問を解いてみましょう。 設問 1 は、 BitTest 関数のプログラムの穴埋めです。 以下に、再度プログラムを掲載します。</p>
<p>空欄 a が真なら返却値を 2 にしています。 したがって、空欄 a は、チェックする桁が全て 1 であることの条件です。<br />
空欄 b が真なら返却値を 0 にしています。 したがって、空欄 b は、チェックする桁が全て 0 であることの条件です。</p>
<div class="card-panel pad_bt00">
〔プログラム 1 〕</p>
<pre>
○整数型関数 : BitTest (8 ビット論理型: Data, 8 ビット論理型: Mask) 
○整数型: RC         /* 返却値 */
▲ <span class="blank">a</span>
| • RC ← 2         /* 返却値は 2 */
+―――
| ▲ <span class="blank">b</span>
| | • RC ← 0        /* 返却値は 0 */
| +―――
| | • RC ← 1        /* 返却値は 1 */
| ▼
▼
• return RC          /* RC を返却値として返す */
</pre>
</div>
<p>以下は、空欄 a と空欄 b の選択肢です。</p>
<p>&#8220;&#038;&#8221; は AND 演算（論理積）を意味し、 &#8220;|&#8221; は OR 演算（論理和）を意味しています。 これらは、条件を結ぶ論理演算ではなく、 2 つの 2 進数の対応する桁同士で論理演算をするものです。</p>
<p>それでは、これらの論理演算を使って、チェックする桁が全て 1 であることと、チェックする桁が全て 0 であることは、どうすれば判断できるのでしょうか？</p>
<div class="card-panel pad_bt00">
解答群</p>
<pre>
ア　(Data & Mask) = "00000000" B
イ　(Data & Mask) = Data
ウ　(Data & Mask) = Mask
エ　(Data | Mask) = "00000000" B
オ　(Data | Mask) = Mask
</pre>
</div>
<p>こういうことを頭の中だけで考えていると、どんどん時間が経過してしまいます。 選択肢があるのですから、それらをよく見てください。</p>
<p>どの選択肢でも、行っている論理演算は、 <code class="language-none pad_w05">Data & Mask</code>（ AND 演算）と <code class="language-none pad_w05">Data | Mask</code> （ OR 演算）のいずれかなのですから、 <span class="u">Data と Mask に具体的なデータを想定</span>して考えましょう。 そうすれば、短い時間に正解を選ぶことができます。</p>
<p>&nbsp;</p>
<p>返却値が 2 （チェックする桁が全て 1 である）になる具体例として、問題に示されていた</p>
<pre>Data = 00110011</pre>
<p>および</p>
<pre>Mask = 00010001</pre>
<p>を想定してみましょう。</p>
<pre class="mag_h40">
      00110011 Data
AND   00010001 Mask
――――――――――――――――――
      00010001
</pre>
<pre>
      00110011 Data
OR    00010001 Mask
――――――――――――――――――
      00110011
</pre>
<p>以上のように、 AND 演算の結果は 00010001 になり（これは、 Mask と同じであり選択肢ウです）、 OR 演算の結果は 00110011 になります（これは、 Data と同じであり選択肢にありません）。</p>
<p>したがって、選択肢ウが正解です。</p>
<p>返却値が 0 （チェックする桁が全て 0 である）になる具体例は、問題に示されていないので、先ほどの具体例をアレンジして</p>
<pre>Data = 00110011</pre>
<p>および</p>
<pre>Mask = 10001000</pre>
<p>を想定してみましょう。</p>
<pre class="mag_tp40">
      00110011 Data
AND   10001000 Mask
――――――――――――――――――
      00000000
</pre>
<pre class="mag_bt40">
      00110011 Data
OR    10001000 Mask
――――――――――――――――――
      10111011
</pre>
<p>以上のように、 AND 演算の結果は 00000000 になり（これは、選択肢アです）、 OR 演算の結果は 10111011 になります（これは、選択肢にありません）。</p>
<p>したがって、選択肢アが正解です。</p>
<h2>具体例を想定してプログラムをトレースする（設問 2 ）</h2>
<p>設問 2 は、 BitTest 関数で引数 Mask を 00000000 （チェックする桁の指定なし）としたときに、返却値として 0 を返すようにするには、プログラムをどのように修正すればよいかという内容です。 変更なしも含めて、以下の 3 つの修正案が示されています。</p>
<p>問題に</p>
<blockquote>
<p class="grey-text">空欄 a と空欄 b には、設問 1 の正しい答えが入っているものとする</p>
</blockquote>
<p>とあるので、ここでは、それぞれの空欄にプログラムを入れてあります。</p>
<div class="card-panel">
<div class="row">
<div class="col m6 s12">
〔修正案 <i class="material-icons">looks_one</i> (変更なし) 〕</p>
<pre class="mag_w05">
▲ (Data & Mask) = Mask
| • RC ← 2
+―――
| ▲ (Data & Mask) = "00000000" B
| | • RC ← 0
| +―――
| | • RC ← 1
| ▼
▼
• return RC
</pre>
</div>
<div class="col m6 s12">
〔修正案 <i class="material-icons">looks_two</i> 〕</p>
<pre class="mag_w05">
▲ (Data & Mask) = "00000000" B
| • RC ← 0
+―――
| ▲ (Data & Mask) = Mask
| | • RC ← 2
| +―――
| | • RC ← 1
| ▼
▼
• return RC
</pre>
</div>
<div class="col m6 s12">
〔修正案 <i class="material-icons">looks_3</i> 〕</p>
<pre class="mag_w05">
• RC ← 2
▲ (Data & Mask) = "00000000" B
| • RC ← 2
▼
▲ (Data & Mask) = Mask
| • RC ← 1
▼
▼
• return RC
</pre>
</div>
</div>
<p>解答群<br />
ア　修正案 <i class="material-icons">looks_one</i>　　<br class="hide-on-med-and-up">イ　修正案 <i class="material-icons">looks_two</i><br />
ウ　修正案 <i class="material-icons">looks_3</i>　　<br class="hide-on-med-and-up">エ　修正案 <i class="material-icons">looks_one</i> 及び <i class="material-icons">looks_two</i><br />
オ　修正案 <i class="material-icons">looks_one</i> 及び <i class="material-icons">looks_3</i>　　<br class="hide-on-med-and-up">カ　修正案 <i class="material-icons">looks_two</i>及び <i class="material-icons">looks_3</i>
</div>
<p>この設問は、<span class="u">具体例を想定してプログラムをトレースすることで、解くことができます</span>。</p>
<pre>Data = 00110011</pre>
<p>および</p>
<pre>Mask = 00000000</pre>
<p>を想定してみましょう。</p>
<p class="mag_tp50">〔修正案 <i class="material-icons">looks_one</i> (変更なし) 〕</p>
<pre>
▲ (Data & Mask) = Mask
| • RC ← 2</span>
+―――
| ▲ (Data & Mask) = "00000000" B
| | • RC ← 0
| +―――
| | • RC ← 1
| ▼
▼
<span style="border:.2em solid #f06292;padding:.5em;">• return RC</span><span class="box-border" style="top:.5em;left:2.25em;width:12em;"></span><span class="pink-text text-lighten-3" style="position:absolute;top:1em;left:15em;">(Data & Mask) = Mask となり、<br>変数 RC に 2 が格納される。</span><span class="pink-text text-lighten-3" style="position:absolute;bottom:1em;left:10em;">返却値として 2 が返される</span>
</pre>
<p>〔修正案 <i class="material-icons">looks_two</i> 〕</p>
<pre>
▲ (Data & Mask) = "00000000" B
| • RC ← 0</span>
+―――
| ▲ (Data & Mask) = Mask
| | • RC ← 2
| +―――
| | • RC ← 1
| ▼
▼
<span style="border:.2em solid #f06292;padding:.5em;">• return RC</span><span class="box-border" style="top:.5em;left:2.25em;width:16em;"></span><span class="pink-text text-lighten-3" style="position:absolute;top:1em;left:20em;">(Data & Mask) = 00000000 となり、<br>変数 RC に 0 が格納される。</span><span class="pink-text text-lighten-3" style="position:absolute;bottom:1em;left:10em;">返却値として 0 が返される</span>
</pre>
<p>〔修正案 <i class="material-icons">looks_3</i> 〕</p>
<pre class="mag_bt50">
• RC ← 2
▲ (Data & Mask) = "00000000" B
| • RC ← 2</span>
▼
▲ (Data & Mask) = Mask
| • RC ← 1</span>
▼
▼
<span style="border:.2em solid #f06292;padding:.5em;">• return RC</span><span class="box-border" style="top:2.75em;left:1em;width:18em;padding:2.45em;"></span><span class="box-border" style="top:8.25em;left:1em;width:18em;padding:2.45em;"></span><span class="pink-text text-lighten-3" style="position:absolute;top:3em;left:20em;">(Data & Mask) = 00000000 となり、<br>いったん変数 RC に 0 が格納される。</span><span class="pink-text text-lighten-3" style="position:absolute;top:9em;left:20em;">(Data & Mask) = Mask ともなるので、<br>変数 RC が 2 で上書きされる。</span><span class="pink-text text-lighten-3" style="position:absolute;bottom:1em;left:11em;">返却値として 2 が返される</span>
</pre>
<p>以上のように、修正案 <i class="material-icons">looks_one</i> では、</p>
<pre>Data & Mask = Mask</pre>
<p>となるので、返却値として 2 が返されます。</p>
<p>&nbsp;</p>
<p>修正案 <i class="material-icons">looks_two</i> では、</p>
<pre>Data & Mask = 00000000</pre>
<p>となるので、返却値として 0 が返されます。</p>
<p>&nbsp;</p>
<p>修正案 <i class="material-icons">looks_3</i> では、</p>
<pre>Data & Mask = 00000000</pre>
<p>となるので返却値を格納する変数 RC にいったん 0 が格納されますが、</p>
<pre>Data & Mask = Mask</pre>
<p>も成り立つので変数 RC が 2 で上書きされて、返却値として 2 が返されます。</p>
<p>&nbsp;</p>
<p>したがって、修正案 <i class="material-icons">looks_two</i> だけが正しく動作し、選択肢イが正解です。</p>
<div class="divider mag_h60 mag_bt30"></div>
<p>今回は、</p>
<ul class="background c-round bold">
<li>「問題に示された具体例を見てプログラムの機能を理解する」</li>
<li>「選択肢に示された変数に具体的なデータを想定して考える」</li>
<li>「具体例を想定してプログラムをトレースする」</li>
</ul>
<p>という解き方を紹介しました。</p>
<p>どの解き方にも「具体例」や「具体的」という言葉があります。 これは、<span class="u">他人（出題者）が作ったプログラムを短い時間で読み取るには、とにかく具体例を想定することが重要</span>だからです。</p>
<p>今後も、この連載では、アルゴリズム問題で最低でも 50 % 正解できる解き方を、あれこれと紹介していきます。少しでも、皆様の参考になれば幸いです。</p>
<p>それでは、またお会いしましょう！</p><p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/algorithms_tips/check_bit/">アルゴリズム問題 具体化すれば 50 ％ 以上正解できる「ビットの検査」</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></content:encoded>
			</item>
		<item>
		<title>アルゴリズム問題 出題テーマの仕組みがわかれば 50 ％ 以上正解できる「ハフマン符号を用いた文字列圧縮」</title>
		<link>https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/algorithms_tips/huffman_code/</link>
		<pubDate>Thu, 03 Mar 2022 02:55:55 +0000</pubDate>
		<dc:creator><![CDATA[矢沢 久雄]]></dc:creator>
				<category><![CDATA[アルゴリズム]]></category>
		<category><![CDATA[午後問題の解説]]></category>

		<guid isPermaLink="false">https://www.seplus.jp/dokushuzemi/fe/fenavi/?post_type=algorithms_tips&#038;p=6414</guid>
		<description><![CDATA[<p>基本情報技術者試験の受験者の多くは、午後試験のアルゴリズム問題を苦手としています。 しかし、その苦手なアルゴリズム問題で、 50 % 以上の正解が得られないと、合格は望めないでしょう。 この連載では、これまでに実施された [&#8230;]</p>
<p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/algorithms_tips/huffman_code/">アルゴリズム問題 出題テーマの仕組みがわかれば 50 ％ 以上正解できる「ハフマン符号を用いた文字列圧縮」</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>基本情報技術者試験の受験者の多くは、午後試験のアルゴリズム問題を苦手としています。 しかし、その<span class="u">苦手なアルゴリズム問題で、 50 % 以上の正解が得られないと、合格は望めない</span>でしょう。</p>
<p>この連載では、これまでに実施された基本情報技術者試験の過去問題を例にして、<span class="bold">最低でも 50 % 正解できる解き方</span>を紹介します。</p>
<p>今回は、平成 31 年度 春期 問 8 「ハフマン符号を用いた文字列圧縮」を取り上げます。</p>
<style>article{font-family:'consolas','Courier New',"HCo Gotham SSm",Gotham,"ヒラギノ角ゴ Pro W3","Hiragino Kaku Gothic ProN","Hiragino Sans","BIZ UDPGothic",Meiryo,sans-serif!important;}ol.background>li{ margin-left: 1.5em;}dl.inline dd{margin-left:2em;}.width-half-on-large{width:50%; margin:auto;}table{font-size:.85em;}@media screen and (max-width:600px){.width-half-on-large{width:100%}}</style>
<h2>試験の出題テーマをしっかりと学習しておく</h2>
<p>「ハフマン符号を用いた文字列圧縮」というタイトルを見てどう思いましたか。 もしも、「えっ？ ハフマン符号なんて知らないよ！」と思われたなら、それではいけません。</p>
<p>基本情報技術者試験には、試験の出題テーマの細目を示したシラバスという資料があります。 この中に「ハフマン符号」という言葉が、ちゃんと示されています。 そのため午前試験の問題でも、ハフマン符号が取り上げられたことがあります。</p>
<p>以下に例を示します。 この問題の正解は、選択肢エです。</p>
<p class="center grey-text mag_tp30">図　ハフマン符号は午前試験に出たこともある</p>
<div class="card-panel mag_bt30">
問 4　平成 30 年度 秋期 午前</p>
<p>出現頻度の異なる A ， B ， C ， D ， E の 5 文字で構成される通信データを，ハフマ<br />
ン符号化を使って圧縮するために，符号表を作成した。 a に入る符号として，適切なものはどれか。</p>
<table class="width-half-on-large centered striped mag_h10">
<thead>
<tr>
<th>文字</th>
<th>出現頻度(%)</th>
<th>符号</th>
</tr>
</thead>
<tbody>
<tr>
<td>A</td>
<td>26</td>
<td>00</td>
</tr>
<tr>
<td>B</td>
<td>25</td>
<td>01</td>
</tr>
<tr>
<td>C</td>
<td>24</td>
<td>10</td>
</tr>
<tr>
<td>D</td>
<td>13</td>
<td><span class="blank">a</span></td>
</tr>
<tr>
<td>E</td>
<td>12</td>
<td>111</td>
</tr>
</tbody>
</table>
<p>ア　001　　イ　010　　<br class="hide-on-med-and-up">ウ　101　　エ　110
</div>
<p><span class="u">試験の出題者は、シラバスに示されていることは、受験者が知っていることとして、詳しい説明なしで出題します</span>。 ですから、試験の出題テーマは、しっかりと学習しておくべきです。</p>
<p>シラバスに示されているのは、出題テーマの細目と用語例だけなので、シラバスを見て学習するわけにはいきません。 基本情報技術者試験の対策本（市販書籍）で学習することをお勧めします。 試験の主な出題テーマ（よく出る出題テーマ）が、網羅されているからです。</p>
<h2>アルゴリズムは手作業でやってみて体得するもの</h2>
<p><span class="bold">アルゴリズムは、暗記して覚えるものではありません。 </span>実際に手作業でやってみて、体得するものです。</p>
<p>先ほどの午前問題を例にして、ハフマン符号の作り方の手順（アルゴリズム）を説明しますので、紙の上に絵を描いて、実際にやってみてください。</p>
<p><span class="u">ハフマン符号は、文字列を圧縮するための技法</span>です。</p>
<p>通常の符号化では、どの文字にも同じビット数（固定長のビット数）を割り当てますが、<span class="u">ハフマン符号では、出現頻度が少ない文字ほど長いビット数（逆に言うと、出現頻度が多い文字ほど短いビット数）に符号化</span>します。</p>
<p>この符号化では、ハフマン木を使います。 ハフマン木は、出現頻度が少ない文字ほど、そこにたどり着くまでの枝の数が多くなるようにした二分木（ 2 つに枝分かれした木）です。</p>
<p>&nbsp;</p>
<p>先ほどの午前問題では、文字の出現頻度が、</p>
<p>A = 26 %<br />
B = 25 %<br />
C = 24 %<br />
D = 13 %<br />
E = 12 %</p>
<p>です。</p>
<ol class="background c-round">
<li>これらの文字を出現頻度の多い順に書き並べて、末端の葉（ leaf ）とします</li>
<li>出現頻度の少ない順に 2 つずつ結んで節（ node ）を作ります。 この節には、 2 つの文字の出現頻度の合計値を書き込みます</li>
<li>同じ手順を、すべての文字と節を結んで根（ root ）ができるまで繰り返せば、ハフマン木が出来上がります</li>
</ol>
<p>以下に上記の手順を図示します。</p>
<ol class="background c-round">
<li>文字を出現頻度の多い順に書き並べる<br />
<figure>
<img class="pad_05 materialboxed z-depth-5 width-half-on-large" src="../../wp-content/uploads/2022/03/huffman_tree_1.jpg" loading="lazy"><br />
</figure>
</li>
<li>出現頻度の少ない順に 2 つずつ結んで節を作り、 2 つの文字の出現頻度の合計値を書き込む<br />
<figure>
<img class="pad_05 materialboxed z-depth-5 width-half-on-large" src="../../wp-content/uploads/2022/03/huffman_tree_2.jpg" loading="lazy"><br />
</figure>
</li>
<li>同じ手順を、すべての文字と節を結んで根ができるまで繰り返せば、ハフマン木が出来上がる<br />
<figure>
<img class="pad_05 materialboxed z-depth-5 width-half-on-large" src="../../wp-content/uploads/2022/03/huffman_tree_3.jpg" loading="lazy"><br />
</figure>
</li>
</ol>
<p>ハフマン木が作成できたら、根からスタートして、左に 0 を、右 1 を割り当て、根から目的の文字までの 0 と 1 を書き並べたものが、ハフマン符号になります。</p>
<figure>
<img class="pad_05 materialboxed z-depth-5 width-half-on-large" src="../../wp-content/uploads/2022/03/huffman_code_1.jpg" loading="lazy"><figcaption>根から左に 0 右に 1 を割り当てる</figcaption></figure>
<p>以下のように、 A 、 B 、 C 、 D 、 E という文字のハフマン符号は、それぞれ 00 、 01 、 10 、 110 、 111 です。 ここでは、 D にたどる例を示しています。</p>
<figure>
<img class="pad_05 materialboxed z-depth-5 width-half-on-large" src="../../wp-content/uploads/2022/03/huffman_code_2.jpg" loading="lazy"><figcaption>ハフマン木をたどってハフマン符号を得る</figcaption></figure>
<h2>仕組みが分かっていればできる問題に確実に正解する</h2>
<p>前置きが長くなりましたが、平成 31 年度 春期 午後 問 8 「ハフマン符号を用いた文字列圧縮」を見てみましょう。</p>
<p>以下に、問題と解答へのリンクがありますので、問題にざっと目を通してください。 じっくり見ると時間がかかりますので、ざっとで OK です。</p>
<table class="responsive-width mag_h30">
<tr>
<th width="50%">平成 31 年度 春期 午後</th>
<td><a href="https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2019h31_1/2019h31h_fe_pm_qs.pdf#page=39">問題</a></td>
<td><a href="https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2019h31_1/2019h31h_fe_pm_ans.pdf" rel="noopener" target="_blank">解答</a></td>
</tr>
</table>
<p>この問題で注目してほしいのは、プログラムの穴埋め（空欄 c 、 d 、 e 、 f ）もありますが、<span class="u">冒頭の空欄 a と b は、ハフマン符号の仕組みが分かっていればできること</span>です。 それなら、冒頭の空欄 a と b に確実に解くことに集中しましょう。</p>
<p>空欄は、全部で 6 つあるので、空欄 a と b に正解して、残りの空欄 c 、 d 、 e 、 f の 1 つ以上に運よく正解できれば、全体の 50 % に達します。</p>
<p>&nbsp;</p>
<p>以下は、問題に示されたハフマン木の例です。</p>
<figure>
  <img class="materialboxed z-depth-5 responsive-width pad_10" src="../../wp-content/uploads/2021/10/h31a_algo_figure.jpg" loading="lazy"><figcaption><span class="small-text">注記 丸の中の数値は各節がもつ値を表す。  &#8220;A&#8221; ～ &#8220;D&#8221; は葉に対応する文字を表す。 </span><br />
  図 1 　文字列 α に対応するハフマン木の例</figcaption></figure>
<p>先ほどの午前問題で示したハフマン木と比べて若干の違いがあり、出現頻度が多い文字を右側にしています（根からスタートして、左に 0 を、右 1 を割り当てるのは同じです）。 これは、問題に示されたプログラムの内容に合わせたからでしょう。</p>
<p>ただし、ハフマン符号の作り方の手順を体得していれば、この例に合わせてハフマン木を作れるはずです。</p>
<p>&nbsp;</p>
<p>以下は、空欄 a 、 b がある設問 1 です。</p>
<div class="card-panel mag_h30">
<p class="bold">設問 1</p>
<p>次の記述中の<span class="blank"></span>に入れる正しい答えを，解答群の中から選べ。</p>
<div class="background">
　文字列 &#8220;ABBBBBBBCCCDD&#8221; を，ハフマン符号化を用いて表現する。 各文字とビット表現を示した表は<span class="blank">a</span>である。 ハフマン符号化によって圧縮すると，文字 &#8220;A&#8221; ～ &#8220;D&#8221; をそれぞれ 2 ビットの固定長で表現したときの当該文字列の総ビット長に対する圧縮率は<span class="blank">b</span>となる。 ここで，圧縮率は次式で計算した値の小数第 3 位を四捨五入して求める。</p>
<div class="row valign-wrapper">
<p>圧縮率 =</p>
<div class="small-text mag_lt10">
<p class="center">ハフマン符号化によって圧縮したときの総ビット長</p>
<div class="divider"></div>
<p class="center">2 ビットの固定長で表現したときの総ビット長</p>
</div>
</div>
</div>
<p>a に関する解答群</p>
<div class="row">
<div class="col m6 s12 mag_h20">
ア</p>
<table class="centered responsive-width">
<tr>
<th>文字</th>
<td>A</td>
<td>B</td>
<td>C</td>
<td>D</td>
</tr>
<tr>
<th>ビット表現</th>
<td>010</td>
<td>1</td>
<td>00</td>
<td>011</td>
</tr>
</table>
</div>
<div class="col m6 s12 mag_h20">
イ</p>
<table class="centered responsive-width">
<tr>
<th>文字</th>
<td>A</td>
<td>B</td>
<td>C</td>
<td>D</td>
</tr>
<tr>
<th>ビット表現</th>
<td>010</td>
<td>0</td>
<td>01</td>
<td>111</td>
</tr>
</table>
</div>
<div class="col m6 s12 mag_h20">
ウ</p>
<table class="centered responsive-width">
<tr>
<th>文字</th>
<td>A</td>
<td>B</td>
<td>C</td>
<td>D</td>
</tr>
<tr>
<th>ビット表現</th>
<td>100</td>
<td>0</td>
<td>101</td>
<td>11</td>
</tr>
</table>
</div>
<div class="col m6 s12 mag_h20">
工</p>
<table class="centered responsive-width">
<tr>
<th>文字</th>
<td>A</td>
<td>B</td>
<td>C</td>
<td>D</td>
</tr>
<tr>
<th>ビット表現</th>
<td>100</td>
<td>1</td>
<td>00</td>
<td>01</td>
</tr>
</table>
</div>
</div>
<p class="mag_tp30">b に関する解答群</p>
<p>ア　0.77　　イ　0.85　　<br class="hide-on-med-and-up">ウ　0.88　　エ　0.92
</div>
<p>文字の出現頻度は、</p>
<p>A = 1<br />
B = 7<br />
C = 3<br />
D = 2</p>
<p>です。</p>
<p>これらを、この問題の例に合わせたハフマン木にすれば、空欄 a 、 b を解くことができます。 さあ、紙の上に絵を描いて、やってみましょう。</p>
<p>&nbsp;</p>
<p>以下に、出来上がったハフマン木を示します。</p>
<figure>
<img class="materialboxed z-depth-5 responsive-width pad_10" src="../../wp-content/uploads/2022/03/q8_huffman_code.jpg" loading="lazy"><figcaption>図　設問 1 の例 &#8220;ABBBBBBBCCCDD&#8221; に合わせて作成したハフマン木</figcaption></figure>
<div class="chip">空欄 a</div>
<p>A 、B 、 C 、 D という文字のハフマン符号は、それぞれ 010 、 1 、 00 、 011 です。</p>
<p>したがって、空欄 a の正解は、選択肢アです。</p>
<div class="chip">空欄 b</div>
<p>A 、 B 、 C 、 D という文字を 2 ビットの固定長で表現すると、全体で 13 文字あるので、</p>
<p class="grey lighten-5 indigo-text pad_h05 pad_lt10">2 × 13 = 26 ビット</p>
<p>です。</p>
<p>ハフマン符号で表現した場合は、</p>
<p>010 という 3 ビットの A が 1 文字<br />
1 という 1 ビットの B が 7 文字<br />
00 という 2 ビットの C が 3 文字<br />
011 という 3 ビットの D が 2 文字</p>
<p>なので、全体で</p>
<p class="grey lighten-5 indigo-text pad_h05 pad_lt10">3 × 1 + 1 × 7 + 2 × 3 + 3 × 2 = 22 ビット</p>
<p>です。</p>
<p>圧縮率は、</p>
<p class="grey lighten-5 indigo-text pad_h05 pad_lt10">22 ÷ 26 ≒ 0.85</p>
<p>です。 したがって、空欄 b の正解は、選択肢イです。 できましたね！</p>
<div class="divider mag_h60 mag_bt30"></div>
<p>今回は、<span class="u">「試験の出題テーマをしっかりと学習しておく」</span>ということの重要性と、<span class="u">「仕組みが分かっていればできる問題に確実に正解する」</span>という解き方を紹介しました。</p>
<p>今後も、この連載では、アルゴリズム問題で最低でも 50 % 正解できる解き方を、あれこれと紹介していきます。 少しでも、皆様の参考になれば幸いです。</p>
<p>それでは、またお会いしましょう！</p><p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/algorithms_tips/huffman_code/">アルゴリズム問題 出題テーマの仕組みがわかれば 50 ％ 以上正解できる「ハフマン符号を用いた文字列圧縮」</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></content:encoded>
			</item>
		<item>
		<title>アルゴリズム問題 こんなもん出来るかと思う問題でも 50 ％ 以上正解する「 Bitap 法による文字列探索」</title>
		<link>https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/algorithms_tips/bitap/</link>
		<pubDate>Tue, 15 Feb 2022 08:32:26 +0000</pubDate>
		<dc:creator><![CDATA[矢沢 久雄]]></dc:creator>
				<category><![CDATA[アルゴリズム]]></category>
		<category><![CDATA[午後問題の解説]]></category>

		<guid isPermaLink="false">https://www.seplus.jp/dokushuzemi/fe/fenavi/?post_type=algorithms_tips&#038;p=6404</guid>
		<description><![CDATA[<p>基本情報技術者試験の受験者の多くは、午後試験のアルゴリズム問題を苦手としています。しかし、その苦手なアルゴリズム問題で、 50 % 以上の正解が得られないと、合格は望めないでしょう。 この連載では、これまでに実施された基 [&#8230;]</p>
<p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/algorithms_tips/bitap/">アルゴリズム問題 こんなもん出来るかと思う問題でも 50 ％ 以上正解する「 Bitap 法による文字列探索」</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>基本情報技術者試験の受験者の多くは、午後試験のアルゴリズム問題を苦手としています。しかし、その<span class="u">苦手なアルゴリズム問題で、 50 % 以上の正解が得られないと、合格は望めない</span>でしょう。</p>
<p>この連載では、これまでに実施された基本情報技術者試験の過去問題を例にして、<span class="bold">最低でも 50 % 正解できる解き方</span>を紹介します。</p>
<p>今回は、現時点で入手できる最新の過去問題である令和元年度秋期<span class="u">「 Bitap 法による文字列探索」</span>を取り上げます。</p>
<style>article,pre{font-family:'consolas','Courier New',"HCo Gotham SSm",Gotham,"ヒラギノ角ゴ Pro W3","Hiragino Kaku Gothic ProN","Hiragino Sans","BIZ UDPGothic",Meiryo,sans-serif!important;}pre{background:#263238;color:#eceff1;font-size:1em;line-height:1.8;margin:1em -24px;padding:1em 0 1em 24px;}table{font-size:.85em;}dl.inline dd{margin-left:2em;}</style>
<h2>午後試験の配点と合格への戦略</h2>
<p>以下は、基本情報技術者試験の午後試験の構成と配点を示したものです。</p>
<figure class="responsive-width">
<table class="striped">
<caption>基本情報技術者試験の午後試験の構成と配点</caption>
<thead>
<tr>
<th>問題番号</th>
<th>分野</th>
<th>配点</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>情報セキュリティ</td>
<td>20 点</td>
</tr>
<tr>
<td>2 ～ 5</td>
<td>ソフトウェア・ハードウェア、データベース、ネットワーク、ソフトウェア設計から 3 問出題<br />マネジメント系、ストラテジ系から 1 問出題</td>
<td>各 15 点</td>
</tr>
<tr>
<td>6</td>
<td>データ構造およびアルゴリズム</td>
<td>25 点</td>
</tr>
<tr>
<td>7 ～ 11</td>
<td>ソフトウェア開発（ C 言語、Java 、 Python 、アセンブラ言語、表計算ソフトが各 1 問出題）</td>
<td>25 点</td>
</tr>
</tbody>
</table><figcaption>
<ul class="background c-round blue-grey-text left-align">
<li>問 1 と問 6 は、必須問題です。</li>
<li>問 2 ～問 5 は、 4 問中 2 問を選択します。</li>
<li>問 7 ～問 11 は、 5 問中 1 問を選択します。</li>
</ul>
</figcaption></figure>
<p>100 点満点で 60 点以上（ 60 % 以上の正解）が合格なのですが、苦手なアルゴリズム問題で 60 % 正解するのは至難の業でしょう。<span class="u">前半部の問 1 ～問 5 でガンバって 70 % 正解</span>しましょう。そうすれば、アルゴリズム問題に 50 % 正解で全体で 60 % に達します（<span class="u">ソフトウェア開発でも 50 % 正解</span>してくださいね！）。これが、合格への戦略です。</p>
<p>この連載では、アルゴリズム問題で最低でも 50 % 正解できる解き方を紹介します。</p>
<h2>「こんな問題わかるか！」と言いたくなるような問題</h2>
<p>令和元年度秋期のアルゴリズム問題（ 問 8 ）を見てみましょう。以下に、問題と解答へのリンクがありますので、問題にざっと目を通してください。じっくり見ると嫌になっちゃうと思いますので、本当にざっとでいいですよ。</p>
<table class="responsive-width centered mag_h30">
<caption>令和元年度秋期 基本情報技術者試験 午後試験</caption>
<tr>
<td><a href="https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2019h31_2/2019r01a_fe_pm_qs.pdf#page=38" rel="noopener" target="_blank">問題</a></td>
<td><a href="https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2019h31_2/2019r01a_fe_pm_ans.pdf">解答</a></td>
</tr>
</table>
<p>問題を見たご感想は、いかがですか？ 「こんな問題わかるか！」と言いたくなるような問題だったでしょう。テーマは、 Bitap 法です。</p>
<p>シラバス（試験の出題テーマの細目を示した資料）にも Bitap 法という用語はありません。強いて言えば、シラバスの「文字列処理のアルゴリズム」という分野に「文字列照合」という用語が示されているので、それで出題されたのでしょう。</p>
<p>ただし、過去の試験に、 Bitap 法が出題されたことはありません。おそらく、これまでに、どんな教材でも、どんな講座でも、 Bitap 法を取り上げているものはないでしょう。 Bitap （ bit-parallel approximate pattern matching 、ビット並列近似パターンマッチング）法は、状態遷移という考え方を使って文字列探索を行うアルゴリズムです。</p>
<p>「こんな問題わかるか！」ですね。</p>
<p>&nbsp;</p>
<p><span class="u">試験には、ときどき「こんな問題わかるか！」と言いたくなるような問題が出ることがあります</span>。そんなときは、<span class="bold">頭ごなしに「できない」と決めつけずに、冷静になってください</span>。</p>
<p>アルゴリズム問題は、選択問題ではなく必須問題（受験者の全員が解かなければならない問題）です。もしも、誰もできないような問題を出したら、その年度だけ合格率が極めて低くなってしまいます。それでは、出題者も困るでしょう。そうならないように、この手の問題は<span class="u">「何だかわからなくても説明された通りにやればできる」</span>ようになっています。</p>
<h2>何だかわからなくても説明された通りにやればできる（1）</h2>
<p>まず、設問 1 の空欄 b がわかりやすいと思いますので、そこから解いていきましょう。以下に、プログラムの説明（該当箇所を抜粋）、プログラム、および空欄 b の解答群を示します。</p>
<div class="card-panel">
〔プログラムの説明〕<br />
 　関数 GenerateBitMask は， Mask[] の全ての要素を &#8220;0&#8221;B に初期化した後，
</div>
<div class="card-panel">
<p class="grey-text hide-on-med-and-up mag_h10 small-text"><i class="material-icons light-blue-text mag_rt05">swipe</i>プログラムは横スクロールできます</p>
<p>〔プログラム〕</p>
<pre>
○整数型関数 : GenerateBitMask(文字型: Pat[], 16 ビット論理型: Mask[])
○整数型 : i, PatLen

・ PatLen ← Pat[] の文字数
■ i: 1, i ≦ 26, 1
|　・Mask[i] ← <span class="bold blank">b</span>  /* 初期化 */
■
■ i: 1, i ≦ PatLen, 1
|　・Mask[Index(Pat[i])] ← <span class="bold blank">c</span> と
|                   Mask[Index(Pat[i])] とのビットごとの論理和
■
· return (PatLen)
</pre>
</div>
<div class="card-panel">
〔解答群〕</p>
<p>b に関する解答群</p>
<dl class="inline">
<dt>ア</dt>
<dd>&#8220;0&#8221; B</dd>
<dt>イ</dt>
<dd>&#8220;1&#8221; B</dd>
<dt>ウ</dt>
<dd>&#8220;1&#8221; B を Pathen ビットだけ論理左シフトした値</dd>
<dt>エ</dt>
<dd>&#8220;1&#8221; B を (Pathen &#8211; 1) ビットだけ論理左シフトした値</dd>
<dt>オ</dt>
<dd>&#8220;1111111111111111&#8221; B</dd>
</dl>
</div>
<p>プログラムの説明とプログラム（ご丁寧にも /* 初期化 */ というコメントまであります）を対応付けると、空欄 b で行われている処理が</p>
<blockquote>
<p class="grey-text">Mask[] の全ての要素を &#8220;0&#8221;B に初期化</p>
</blockquote>
<p>だとわかるでしょう。空欄 b の解答群を見ると、選択肢アの &#8220;0&#8221;B が適切です。何だかわからなくても説明された通りに（プログラムの説明の通りに）やって、正解を選べました。同様の解き方で、空欄 c と空欄 a も正解を選べるでしょう。</p>
<h2>何だかわからなくても説明された通りにやればできる（2）</h2>
<p>今度は、設問 2 です。これは、以下のプログラムで、 Mask[Index(Text[i])] と Status の値をトレース（処理の流れと変数の変化を追いかけること）せよ、という問題です。</p>
<p>これこそ正に、何だかわからなくても説明された通りに（プログラムの内容の通りに）やればできる、の好例です。プログラムの意味も、何をやっているかも、わからなくて構いません。</p>
<p>Mask[Index(Text[i])] の初期値を &#8220;10101&#8221;B とし、<br />
Status の初期値を &#8220;1&#8221;B として<br />
トレースすればよいのです。</p>
<div class="card-panel">
〔プログラム〕</p>
<pre>
○整数型関数: BitapMatch(文字型: Text[], 文字型: Pat[])
○16 ビット論理型: Goal, Status, Mask[26]
○整数型: i, TextLen, PatLen
・TextLen ← Text[] の文字数
・PatLen ← GenerateBitMask(Pat[], Mask[])
・Status ← "0"B
・Goal ← "1"B を (PatLen - 1) ビットだけ論理左シフトした値
■ i: 1, i ≦ TextLen, 1
|　・Status ← Status を 1 ビットだけ論理左シフト値と              <i class="material-icons light-blue-text">fast_rewind</i>α
|                                         "1"B とのビットごとの論理和
|　・Status ← Status と Mask[Index(Text[i])] とのビットごとの論理積　<i class="material-icons light-blue-text">fast_rewind</i>β
|　▲ Status と Goal とのビットごとの論理積 ≠ "0"B
|　|　・return (i - PatLen + 1)
|　▼
■
· return (-1)
</pre>
</div>
<p>以下は、プログラムをトレースした結果です。これによって、空欄 d 、空欄 e 、空欄 f の正解を選べます。</p>
<table class="centered striped responsive-width">
<caption>プログラムをトレースした結果</caption>
<thead>
<tr>
<th>i</th>
<th>Mask[Index(Text[i])]</th>
<th>Status</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>&#8220;10101&#8221;B</td>
<td>&#8220;1&#8221;B</td>
</tr>
<tr>
<td>2</td>
<td>&#8220;10101&#8221;B</td>
<td>&#8220;1&#8221;B （空欄 d ）</td>
</tr>
<tr>
<td>3</td>
<td>&#8220;10&#8221;B</td>
<td>&#8220;10&#8221;B</td>
</tr>
<tr>
<td>4</td>
<td>&#8220;101000&#8221;B</td>
<td>&#8220;0&#8221;B</td>
</tr>
<tr>
<td>5</td>
<td>&#8220;101000&#8221;B</td>
<td>&#8220;0&#8221;B</td>
</tr>
<tr>
<td>6</td>
<td>&#8220;10101&#8221;B</td>
<td>&#8220;1&#8221;B</td>
</tr>
<tr>
<td>7</td>
<td>&#8220;10101&#8221;B</td>
<td>&#8220;1&#8221;B</td>
</tr>
<tr>
<td>8</td>
<td>&#8220;10&#8221;B</td>
<td>&#8220;10&#8221;B</td>
</tr>
<tr>
<td>9</td>
<td>&#8220;10101&#8221;B （空欄 e ）</td>
<td>&#8220;101&#8221;B （空欄 f ）</td>
</tr>
<tbody>
</table>
<p>さあ、これで十分でしょう。</p>
<p>この問題には、設問 1 （ a 、 b 、 c ）、設問 2 （ d 、 e 、 f ）、設問 3 （ g 、 h 、 i ）という、全部で 9 つの選択項目がありますが、ここまでで 6 つに正解できました。それぞれの配点はわかりませんが（設問ごとの配点は公開されていません）、 9 つの内の 6 つに正解できたのですから、きっと 50 % に達したでしょう。</p>
<p>設問 3 は、正規表現という、これまた小難しそうなテーマをからめているので、できなくても気にしないでください。</p>
<h2>試験問題の解説は、あくまでも参考としましょう</h2>
<p>市販教材や Web 記事などで、アルゴリズム問題の解説を読むときに注意してほしいことがあります。それは、こういうことを言うと甚だ無責任であり申し訳ないのですが、<span class="bold">「アルゴリズム問題の解き方は自分で見出してほしい」</span>ということです。</p>
<p>市販教材 や Web 記事などのアルゴリズム問題の解説では「こうだから、これが適切である」のように正解をズバリと示しています。それを読んだ人は「どうして、こうだから、を見いだせる理由がわからない」と思うでしょう。</p>
<p>「こうだから」がわかるのは、解説者の経験です。経験が違う読者には、理解できない部分があっても当然です。このようなアルゴリズム問題の解説は、あくまで参考として、自分流の「こうだから」を見出してください。もちろん、この連載も同様です。</p>
<div class="divider mag_tp60 mag_bt30"></div>
<p>今回は、<span class="u">「こんな問題わかるか！」と言いたくなるような問題でも、「説明された通りにやればできる」</span>という方法を紹介しました。</p>
<p>今後も、この連載では、アルゴリズム問題で最低でも 50 % 正解できる解き方を、あれこれと紹介していきます。少しでも、皆様の参考になれば幸いです。</p>
<p>それでは、またお会いしましょう！</p><p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/algorithms_tips/bitap/">アルゴリズム問題 こんなもん出来るかと思う問題でも 50 ％ 以上正解する「 Bitap 法による文字列探索」</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></content:encoded>
			</item>
	</channel>
</rss>
