<?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/tag/%E3%83%9E%E3%82%B9%E3%82%AF/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.seplus.jp/dokushuzemi/ec/fe/fenavi</link>
	<description>基本情報技術者試験を学習する人のためにつくられた専門メディア。250本以上の記事を掲載し、勉強方法や各分野のポイント、過去問解説など、試験に役立つ情報を発信。試験対策書籍を執筆する著者が、はじめて学ぶ人でもわかりやすく解説します。（2023年度からの新制度に対応済み）</description>
	<lastBuildDate>Mon, 20 Apr 2026 07:08:52 +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>こうすりゃ解ける！ 2019年度秋期 (令和元年度) 基本情報技術者試験の午後問題を徹底解説</title>
		<link>https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/gogo_arukikata/analytics_question_pm_2019autumn/</link>
		<pubDate>Fri, 08 Nov 2019 04:33:48 +0000</pubDate>
		<dc:creator><![CDATA[矢沢 久雄]]></dc:creator>
				<category><![CDATA[アルゴリズム]]></category>
		<category><![CDATA[マスク]]></category>
		<category><![CDATA[午後問題の解説]]></category>
		<category><![CDATA[試験講評]]></category>

		<guid isPermaLink="false">https://www.seplus.jp/dokushuzemi/fe/fenavi/?post_type=gogo_arukikata&#038;p=2714</guid>
		<description><![CDATA[<p>2019 年 10 月 20 日（日）に実施された 令和元年度 秋期 基本情報技術者試験 の 午後問題 の中から、必須問題である問 8「データ構造及びアルゴリズム」の解き方を解説します。 テーマは「 Bitap 法による [&#8230;]</p>
<p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/gogo_arukikata/analytics_question_pm_2019autumn/">こうすりゃ解ける！ 2019年度秋期 (令和元年度) 基本情報技術者試験の午後問題を徹底解説</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>2019 年 10 月 20 日（日）に実施された <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">令和元年度 秋期 基本情報技術者試験 の 午後問題 の中から、必須問題である問 8「データ構造及びアルゴリズム」</a>の解き方を解説します。</p>
<p>テーマは「 Bitap 法による文字列検索」です。</p>
<p>ありきたりの解説には、飽き飽きしているでしょうから、「こうすりゃ解ける！」という解法のテクニックと心構えを伝授させていただきます。</p>
<div class="card-panel blue-grey-text z-depth-0 grey lighten-5 mag_h30">
<i class="material-icons blue-text">error</i> <span class="small-text">本記事ではわかりやすいよう、問題に背景色や下線などを入れています</span>
</div>
<h2>一見して超難しそうな問題の対処方法を伝授します</h2>
<p>今回の試験を受験された方は、この問題を見て「何これ！ Bitap 法なんて知らない！ 超難しそう！」と思われたでしょう。</p>
<p>基本情報技術者試験のアルゴリズムの問題には、時々こういう超難しそうな問題が出ることがあります。これまでにも「ガウスの消去法」「ニュートン法」「ダイクストラ法」など、超難しそうな問題が出たことがあります。</p>
<p>&nbsp;</p>
<p><strong>でも、ご安心ください。一見して超難しそうな問題ほど、設問の内容は簡単なのです。</strong></p>
<p>なぜなら、アルゴリズムの問題は、受験者全員が解く必須問題だからです。</p>
<p>もしも、設問も超難しかったら、合格率が極端に下がってしまいます。試験を運営する側としては、そんなことはできないはずです。</p>
<p>&nbsp;</p>
<p>それでは、この手の問題は、どうやって解いたらよいのでしょうか？</p>
<p>この記事では、その秘訣を伝授させていただきます。</p>
<p>それでは、設問 1 から解いて行きましょう。問題、設問、解答群を以下に示します。</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}dl{margin-top:3em;line-height:2}dl.inline dd{margin-left:2em}pre{font-size:1em;background:#424242;color:#fafafa;margin:1.5em -7.5%!important;padding:1.5em 7.5%!important}.card-panel pre{margin:2em -24px!important;padding-left:24px!important}table.forth-col-left tbody tr td:nth-child(4){text-align:left}.r-width{width:50%;margin:auto}@media only screen and (max-width:600px){.r-width{width:100%}}</style>
<div class="card-panel mag_h30" style="line-height: 150%">
問 8　次のプログラムの説明及びプログラムを読んで，設問 1 ~ 3 に答えよ。</p>
<p>〔プログラムの説明〕</p>
<p>　関数 BitapMatch は，Bitap 法を使って文字列検索を行うプログラムである。<br />
　Bitap 法は，検索対象の文字列(以下，対象文字列という)と検索文字列の照合に，個別の文字ごとに定義されるビット列を用いるという特徴をもつ。</p>
<p>　なお，本問では，例えば 2 進数の 16 ビット論理型の定数 0000000000010101 は，上位の 0 を省略して &#8220;10101&#8221;B と表記する。</p>
<dl class="inline">
<dt>(1)</dt>
<dd>　関数 BitapMatch は，対象文字列を Text[] に，検索文字列を Pat[] に格納して呼び出す。配列の要素番号は 1 から始まり， Text[] の i 番目の文字は Text[i] と表記する。Pat[] についても同様に i 番目の文字は Pat[i] と表記する。対象文字列と検索文字列は，英大文字で構成され，いずれも最長 16 文字とする。<br />
　対象文字列 Text[] が &#8220;AACBBAACABABAB&#8221;，検索文字列 Pat[] が &#8220;ACABAB&#8221; の場合の格納例を，図 1 に示す。</dd>
</dl>
<div class="center mag_h30 small-text blue-grey-text">
図 1　対象文字列と検索文字列の格納例<br />
<img class="hoverable materialboxed mag_h15" data-caption="図 1　対象文字列と検索文字列の格納例" src="../../wp-content/uploads/2019/11/q8_r1a_pm_figure1.png" style="margin: auto;">
</div>
<dl class="inline">
<dt>(2)</dt>
<dd>　関数 BitapMatch は，関数 GenerateBitMask を呼び出す。<br />
　関数 GenerateBitMask は，文字 &#8220;A&#8221; ~ &#8220;Z&#8221; の文字ごとに，検索文字列に応じた ビット列(以下，ビットマスクという)を生成し，要素数 26 の 16 ビット論理型配列 Mask[] に格納する。Mask[1] には文字 &#8220;A&#8221; に対するビットマスクを， Mask[2] には文字 &#8220;B&#8221; に対するビットマスクを格納する。このように Mask[1] ~ Mask[26] に文字 &#8220;A&#8221; ~ &#8220;Z&#8221; に対応するビットマスクを格納する。</p>
<p>　関数 GenerateBitMask は， Mask[] の全ての要素を &#8220;0&#8221;B に初期化した後，1 以上で Pat[] の文字数以下の全ての i に対して，Pat[i] の文字に対応する Mask[] の要素である Mask[Index(Pat[i])] に格納されている値の，下位から数えて i 番目のビットの値を 1 にする。</p>
<p>　関数 Index は，引数にアルファベット順で n 番目の英大文字を設定して呼び出すと，整数 n (1 ≦ n ≦ 26 ) を返す。</dd>
</dl>
<dl class="inline">
<dt>(3)</dt>
<dd>　図 1 で示した， Pat[] が &#8220;ACABAB&#8221; の例の場合，関数 GenerateBitMask を実行すると， Mask[] は図 2 のとおりになる。</dd>
</dl>
<div class="center mag_h30 small-text blue-grey-text">
図 2　図 1 で示した Pat[] に対する Mask[] の値<br />
<img class="mag_tp30 hoverable materialboxed mag_h15" data-caption="図 1 で示した Pat[] に対する Mask[] の値" src="../../wp-content/uploads/2019/11/q8_r1a_pm_figure2.png" style="margin: auto;">
</div>
<dl class="inline">
<dt>(4)</dt>
<dd>　関数 GenerateBitMask の引数と返却値の仕様は，表 1 のとおりである。</dd>
</dl>
<table class="striped inline-block mag_h30 centered forth-col-left">
<caption class="mag_h20 blue-grey-text">表 1　関数 GenerateBitMask の引数と返却値の仕様</caption>
<thead>
<tr>
<th>引数/<br class="hide-on-med-and-up">返却値</th>
<th>データ型</th>
<th>入力/<br class="hide-on-med-and-up">出力</th>
<th class="block">説明</th>
</tr>
</thead>
<tbody>
<tr>
<td>Pat[]</td>
<td>文字型</td>
<td>入力</td>
<td class="block">検索文字列が格納されている 1 次元配列 16 ビット</td>
</tr>
<tr>
<td>Mask[]</td>
<td>16 ビット<br class="hide-on-med-and-up">論理型</td>
<td>出力</td>
<td class="block">文字 &#8220;A&#8221; ～ &#8220;Z&#8221; に対応するビットマスクが格納される 1 次元配列</td>
</tr>
<tr>
<td>返却値</td>
<td>整数型</td>
<td>出力</td>
<td class="block">検索文字列の文字数</td>
</tr>
</tbody>
</table>
<p>〔プログラム 1 〕</p>
<pre>
○整数型関数 : GenerateBitMask(文字型: Pat[], 16 ビット論理型: Mask[])
○整数型 : i, PatLen

・ PatLen ← Pat[] の文字数
■ i: 1, i ≦ 26, 1
|　・Mask[i] ← <span class="bold" style="border: 2px solid">　　b　　</span>  /* 初期化 */
■
■ i: 1, i ≦ PatLen, 1
|　・Mask[Index(Pat[i])] ← <span class="bold" style="border: 2px solid">　　c　　</span> と
|                   Mask[Index(Pat[i])] とのビットごとの論理和
■
· return (PatLen)
</pre>
<p>設問 1 プログラムの説明及びプログラム 1 中の <span class="bold" style="border: 2px solid">　　　　</span> に入れる正しい答えを，解答群の中から選べ。</p>
<p>a に関する解答群<br />
ア　0000000000000101　　<br class="hide-on-med-and-up">イ　0000000000101000<br />
ウ　0001010000000000　　<br class="hide-on-med-and-up">エ　1010000000000000</p>
<p>b に関する解答群</p>
<pre>
ア　 "0"B
イ　 "1"B
ウ　 "1"B を Pathen ビットだけ論理左シフトした値
エ　 "1"B を (Pathen - 1) ビットだけ論理左シフトした値
オ　 "1111111111111111"B
</pre>
<p>c に関する解答群</p>
<pre>
ア　 "1"B を (i - 1) ビットだけ論理左シフトした値
イ　 "1"B を i ビットだけ論理左シフトした値
ウ　 "1"B を (Pathen - 1) ビットだけ論理左シフトした値
エ　 "1"B を PatLen ビットだけ論理左シフトした値
オ　 "1"B
</pre>
</div>
<h2>秘訣 1：<br />説明文とプログラムを対応付ける</h2>
<p>プログラム全体の仕組みがわからなくても、プログラムの説明文とプログラムを対応付けると、空欄に何を入れればよいかがわかる場合があります。</p>
<p>この問題では、空欄 b が正にそれです。</p>
<p>プログラムの説明に「 Mask[] のすべての要素を &#8220;0&#8221;B に初期化」とあり、それがプログラムの空欄 b に該当します。</p>
<div class="card-panel mag_h30"">
〔プログラムの説明〕</p>
<p>　関数 GenerateBitMask は， <span class="u">Mask[] の全ての要素を &#8220;0&#8221;B に初期化</span>した後，1 以上で Pat[] の文字数以下の全ての i に対して，(中略)
</div>
<p>ご丁寧に、というか<strong>大ヒント</strong>として、「/* 初期化 */」というコメントまで付けられています。</p>
<p>〔プログラム 1 〕</p>
<pre>
■ i: 1, i ≦ 26, 1
|　<span style="border: solid 2px #f44336; padding: .5em;">・Mask[i] ← <span class="bold" style="border: 2px solid">　　b　　</span>  /* 初期化 */</span>
■
</pre>
<p>空欄 b の正解は、選択肢アです。</p>
<h2>秘訣 2：<br />問題に示された具体例をヒントにして考える</h2>
<p>今度は、プログラムの空欄 c に何が入るかを、説明文と対応付けて考えてみましょう。</p>
<div class="card-panel mag_h30">
〔プログラムの説明〕</p>
<p>　関数 GenerateBitMask は， Mask[] の全ての要素を &#8220;0&#8221;B に初期化した後，1 以上で Pat[] の文字数以下の全ての i に対して，<span class="u">Pat[i] の文字に対応する Mask[] の要素である Mask[Index(Pat[i])] に格納されている値の，下位から数えて i 番目のビットの値を 1 にする。</span>
</div>
<p>この説明文を見る限り、空欄 c に入るのは「下位から数えて i 番目のビット を 1 にした値」であり、</p>
<p>i が 1 なら 0000000000000001<br />
i が 2 なら 0000000000000010<br />
i が 3 なら 0000000000000100<br />
&#xFE19;</p>
<p>のはずです。0000000000000001 を i &#8211; 1 だけ左論理シフトすればよいでしょう。</p>
<p>ところが、プログラムを見ると「空欄 c と Mask[Index(Pat[i])] とのビットごとの論理和」になっています。なぜでしょう？</p>
<p>〔プログラム 1 〕</p>
<pre>

■ i: 1, i ≦ PatLen, 1
|　・Mask[Index(Pat[i])] ← <span class="bold" style="border: 2px solid">　　c　　</span> と
|                   Mask[Index(Pat[i])] とのビットごとの論理和
■
</pre>
<p>こういうときに頼りになるのが、問題に示された具体例です。</p>
<p>具体例を見ると「そういうことか！」とわかる場合があります。コメントも大ヒントですが、<strong>具体例も大ヒント</strong>なのです。</p>
<p>以下の具体例を見ると、&#8221;ACABAB&#8221; の先頭（先ほどのプログラムで i = 1 ）の &#8220;A&#8221; に対応するビットマスクが、<br />
0000000000000001 ではなく、<br />
0000000000010101 になっています。</p>
<div class="card-panel mag_h30"">
〔問題に示された具体例〕</p>
<dl class="inline">
<dt>(3)</dt>
<dd>　図 1 で示した， Pat[] が &#8220;ACABAB&#8221; の例の場合，関数 GenerateBitMask を実行すると， Mask[] は図 2 のとおりになる。</dd>
</dl>
<div class="center mag_h30 small-text blue-grey-text">
図 2　図 1 で示した Pat[] に対する Mask[] の値<br />
<img class="mag_tp30 hoverable materialboxed mag_h15" data-caption="図 1 で示した Pat[] に対する Mask[] の値" src="../../wp-content/uploads/2019/11/q8_r1a_pm_figure2.png" style="margin: auto;">
</div>
</div>
<p>「 えっ、何これ？」<br />
「 1 が 1 個でなくて 3 個ある．．．」<br />
「 ．．．あっ、そういうことか！」<br />
「 &#8220;ACABAB&#8221; の中に &#8220;A&#8221; が 3 個あるから、それを論理和で重ね合わせているんだ！」</p>
<p>とわかるでしょう。</p>
<p>つまり空欄 c は、0000000000000001 を i &#8211; 1 だけ論理左シフトするだけでなく、それまでに得られているビットマスクと論理和で重ね合わせるのです。</p>
<p>したがって、正解は選択肢アです。</p>
<h2>秘訣 3：<br />すぐに解けない設問は後回しにする</h2>
<p>空欄 a を飛ばして、空欄 b と空欄 c を先に解きました。これは、空欄 a の穴埋めは、先に空欄 b と空欄 c を解かないとできないからです。</p>
<p>このように、<strong>もしも順番通りに解いてできない設問があった場合は後回し</strong>にして、先の設問を解いてみましょう。それによって、後回しにした設問が解ける場合があるからです。</p>
<p>&nbsp;</p>
<p>空欄 b と空欄 c を解いたことで、ビットマスクを作る方法がわかりました。</p>
<p>空欄 a には、 &#8220;B&#8221; に対応するビットマスクが入ります。</p>
<p>問題に示された &#8220;ACABAB&#8221; では、先頭から 4 番目と 6 番目に &#8220;B&#8221; が登場します。したがって、</p>
<p>0000000000001000 と<br />
0000000000100000 を論理和で重ね合わせた<br />
0000000000101000 が &#8220;B&#8221; に対応するビットマスクです。</p>
<p>正解は、選択肢イです。</p>
<p><a href="../../tag/マスク/" class="tag mag_tp30">マスク</a></p>
<h2>秘訣 4：<br />具体例をコツコツとトレースすればできる</h2>
<p>それでは、設問 2 に進みましょう。問題、設問、解答群を以下に示します。</p>
<div class="card-panel mag_h30"">
〔関数 BitapMatch の説明〕</p>
<dl class="inline">
<dt>(1)</dt>
<dd>　Text[] と Pat[] を受け取り， Text[] の要素番号の小さい方から Pat[] と一致する文字列を検索し，見つかった場合は，一致した文字列の先頭の文字に対応する Text[] の要素の要素番号を返し，見つからなかった場合は，-1 を返す。 </dd>
<dt>(2)</dt>
<dd>　図 1 の例では， Text[7] ~ Text[12] の文字列が Pat[] と一致するので，7 を返す。</dd>
<dt>(3)</dt>
<dd>　関数 BitapMatch の引数と返却値の仕様は，表 2 のとおりである。</dd>
</dl>
<table class="striped inline-block mag_h30 centered forth-col-left">
<caption>表 2　関数 BitapMatch の引数と返却値の仕様</caption>
<thead>
<tr>
<th>引数/返却値</th>
<th>データ型</th>
<th>入力/出力</th>
<th width="45%">説明</th>
</tr>
<tbody>
<tr>
<td>Text[]</td>
<td>文字型</td>
<td>入力</td>
<td>対象文字列が格納されている 1 次元配列</td>
</tr>
<tr>
<td>Pat[]</td>
<td>文字型</td>
<td>入力</td>
<td>検索文字列が格納されている 1 次元配列</td>
</tr>
<tr>
<td>返却値</td>
<td>整数型</td>
<td>出力</td>
<td>対象文字列中に検索文字列が見つかった場合は，一致した文字列の先頭の文字に対応する対象文字列の要素の要素番号を，検索文字列が見つからなかった場合は， -1 を返す。</td>
</tr>
</tbody>
</table>
<p>〔プログラム 2 〕</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">fast_rewind</i>α
|                                         "1"B とのビットごとの論理和
|　・Status ← Status と Mask[Index(Text[i])] とのビットごとの論理積　<i class="material-icons">fast_rewind</i>β
|　▲ Status と Goal とのビットごとの論理積 ≠ "0"B
|　|　・return (i - PatLen + 1)
|　▼
■
· return (-1)
</pre>
<p>設問 2　次の記述中の <span class="bold" style="border: 2px solid">　　　　</span> に入れる正しい答えを，解答群の中から選べ。</p>
<p>　図 1 で示したとおりに， Text[] と Pat[] に値を格納し，関数 BitapMatch を実行した。プログラム 2 の行 β を実行した直後の変数 i と配列要素 Mask[Index(Text[i])]と変数 Status の値の遷移は，表 3 のとおりである。</p>
<p>　例えば，i が 1 のときに行 β を実行した直後の Status の値は &#8220;1&#8221;B であることから， i が 2 のときに行 α を実行した直後の Status の値は，&#8221;1&#8243;B を 1 ビッ トだけ論理左シフトした &#8220;10&#8221; B と &#8220;1&#8221;B とのビットごとの論理和を取った &#8220;11&#8221;B となる。次に， i が 2 のときに行 β を実行した直後の Status の値は， Mask[Index(Text[2])] の値が &#8220;10101&#8221;B であることを考慮すると， <span class="bold" style="border: 2px solid">　　d　　</span> となる。</p>
<p>　同様に， i が 8 のときに行 β を実行した直後の Status の値が &#8220;10&#8221;B であるということに留意すると， i が 9 のときに行 α を実行した直後の行 β で参照する Mask[Index(Text[9])] の値は <span class="bold" style="border: 2px solid">　　e　　</span> であるので，行 β を実行した直後の Status の値は <span class="bold" style="border: 2px solid">　　f　　</span> となる。</p>
<p class="small-text blue-grey-text mag_h30" style="width: 90%: margin: auto;">表 3　図 1 の格納例に対してプログラム 2 の行 β を実行した直後の配列要素 Mask[Index(Text[i])] と変数 Status の値の遷移</p>
<p><span class="small-text grey-text hide-on-med-and-up"><i class="material-icons mag_rt05">info</i>右にスクロールします</span></p>
<table class="bordered centered responsive-table mag_bt30">
<thead>
<tr>
<th>i</th>
<th>1</th>
<th>2</th>
<th>･･･</th>
<th>8</th>
<th>9</th>
<th>･･･</th>
</tr>
</thead>
<tbody>
<tr>
<td>Mask[Index(Text[i])]</td>
<td>&#8220;10101&#8221;B</td>
<td>&#8220;10101&#8221;B</td>
<td>･･･</td>
<td>&#8220;10&#8221;B</td>
<td><span class="bold" style="border: 2px solid">　　e　　</span></td>
<td>･･･</td>
</tr>
<tr>
<td>Status</td>
<td>&#8220;1&#8221;B</td>
<td><span class="bold" style="border: 2px solid">　　d　　</span></td>
<td>･･･</td>
<td>&#8220;10&#8221;B</td>
<td><span class="bold" style="border: 2px solid">　　f　　</span></td>
<td>･･･</td>
</tr>
</tbody>
</table>
<p>d ～ f に関する解答群</p>
<p>ア　&#8221;0&#8243;B　　<br class="hide-on-med-and-up">イ　&#8221;1&#8243;B　　<br class="hide-on-med-and-up">ウ　&#8221;10&#8243;B　　<br class="hide-on-med-and-up">エ　&#8221;11&#8243;B<br />
オ　&#8221;100&#8243;B　<br class="hide-on-med-and-up">カ　&#8221;101&#8243;B　　<br class="hide-on-med-and-up">キ　&#8221;10101&#8243;B
</div>
<p>設問 2 の内容は、問題に示された具体例のデータにおいて、プログラム 2 の β の位置の処理を行った直後に、i と Mask[Index(Text[i])] と Status の値が何になっているかを答えよ、というものです。</p>
<p>ここで、またまた「 Bitap 法なんて知らない！」と怖気づいてはいけません。</p>
<p>擬似言語に示された通りにデータを処理して行けば、空欄を埋められるからです。</p>
<p>&nbsp;</p>
<p>それでは、トレースしてみましょう。i ＝ 1 ～ 9 までトレースすれば、すべての空欄を埋められます。</p>
<p>トレースするのは、i をループカウンタとした繰り返し処理です。</p>
<p>以下に、プログラムを示します。この短いプログラムを i ＝ 1 ～ 9 までトレースすればよいのですから、決して難しくないはずです。</p>
<p>トレースするのは、<strong>β の直後の値であることに注意</strong>してください。</p>
<p>〔プログラム 2 〕</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">fast_rewind</i>α
|                                         "1"B とのビットごとの論理和
|　<span class="u">・Status ← Status と Mask[Index(Text[i])] とのビットごとの論理積 　<i class="material-icons">fast_rewind</i>β</span>
|　▲ Status と Goal とのビットごとの論理積 ≠ "0"B
|　|　・return (i - PatLen + 1)
|　▼
■
· return (-1)
</pre>
<p>トレースした結果を以下に示します。</p>
<table class="bordered centered mag_h30 r-width">
<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>空欄 d 、空欄 e 、空欄 f の正解は、選択肢イ、選択肢キ、選択肢カです。</p>
<h2>秘訣 5：<br />設問に答えられればよいと割り切って解く</h2>
<p>今度は、設問 3 です。問題、設問、解答群を以下に示します。</p>
<div class="card-panel mag_h30"">
設問 3</p>
<p>　関数 GenerateBitMask の拡張に関する，次の記述中の <span class="bold" style="border: 2px solid">　　　　</span> に入れる正しい答えを，解答群の中から選べ。ここで， プログラム 3 中の <span class="bold" style="border: 2px solid">　　b　　</span> には，設問 1 の <span class="bold" style="border: 2px solid">　　b　　</span> の正しい答えが入っているものとする。</p>
<p>表 4 に示すような正規表現を検索文字列に指定できるように，関数 GenerateBitMask を拡張し，関数 GenerateBitMaskRegex を作成した。</p>
<table class="bordered mag_h30 block">
<caption class="mag_h20">表 4　正規表現</caption>
<thead class="hide-on-small-only">
<tr>
<th width="10%">記号</th>
<th>説明</th>
</tr>
</thead>
<tbody>
<tr>
<td><span class="chip hide-on-med-and-up">記号</span> []</td>
<td><span class="chip hide-on-med-and-up">説明</span> []内に記載されている文字のいずれか 1 文字に一致する文字を表す。例えば， &#8220;A[XYZ]B&#8221; は， &#8220;AXB&#8221; ， &#8220;AYB&#8221; ， &#8220;AZB&#8221; を表現している。</td>
</tr>
</tbody>
</table>
<p>〔プログラム 3 〕</p>
<pre>
○整数型関数: GenerateBitMaskRegex(文字型: Pat[],
                                16 ビット論理型: Mask[])
○整数型: i, OriginalPatLen, PatLen, Mode

・OriginalPatLen ← Pat[] の文字数
・PatLen ← 0
・Mode ← 0
■ i: 1, i ≦ 26, 1
|　・Mask[i] ← <span class="bold" style="border: 2px solid">　　b　　</span>  /* 初期化 */
■
■ i: 1, i ≦ Original PatLen, 1
|　▲ Pat[i] = "["
|　|　・Mode ← 1
|　|　・PatLen ← PatLen + 1
|--+-----
|　|
|　|　▲ Pat[i] = "]"
|　|　|　・Mode ← 0
|　|--+-----
|　|　|　▲ Mode = 0
|　|　|　|　・PatLen ← PatLen + 1
|　|　|　▼
|　|　|　・Mask[Index(Pat[i])] ← "1"B を (PatLen – 1) ビットだけ
|　|　|　    論理左シフトした値と Mask[Index(Pat[i])] とのビットごとの論理和
|　|　▼
|　▼
■
・return (PatLen)
</pre>
<p>Pat[] に &#8220;AC[BA]A[ABC]A&#8221; を格納して，関数 GenerateBitMaskRegex を呼び出した場合を考える。この場合，文字 &#8220;A&#8221; に対応するビットマスクである Mask[1] は <span class="bold" style="border: 2px solid">　　g　　</span> となり，関数 GenerateBitMaskRegex の返却値は <span class="bold" style="border: 2px solid">　　h　　</span> となる。また，Pat[] に格納する文字列中において [] を入れ子にすることはできないが，誤って Pat[] に &#8220;AC[B[AB]AC]A&#8221; を格納して関数 GenerateBitMaskRegex を呼び出した場合， Mask[1] は <span class="bold" style="border: 2px solid">　　i　　</span>となる。</p>
<p>g ，i に関する解答群</p>
<p>ア　 &#8220;1001101&#8221;B　　<br class="hide-on-med-and-up">イ　 &#8220;1010100001&#8221;B<br />
ウ　 &#8220;1011001&#8221;B　　<br class="hide-on-med-and-up">エ　 &#8220;101111&#8221;B<br />
オ　 &#8220;110011&#8221;B　　<br class="hide-on-med-and-up">カ　 &#8220;111101&#8221;B</p>
<p>h に関する解答群</p>
<p>ア　4　　イ　6　　ウ　9　　エ　13
</p></div>
<p>「正規表現」という、これまた難しそうな言葉が登場しましたが、決して怖気づかないでください。</p>
<p>どうしてこのプログラムで正規表現に対応できるのかを<strong>理解するのではなく、設問に答えられればよい</strong>のです。そう割り切って解いてください。</p>
<p>&nbsp;</p>
<p>プログラムの内容を見て、簡単そうな空欄から解いていきましょう。</p>
<p>まず、PatLen の値を求める空欄 h です。</p>
<p>Mode の初期値は 0 で、Mode = 0 なら 1 文字処理するごとに PatLen の値を 1 増やしています。</p>
<p>&#8220;[&#8221; を処理すると、PatLen を 1 増やし、Mode を 1 にします。</p>
<p>そして、 &#8220;]&#8221; を処理すると、Mode を 0 に戻します。</p>
<p>これは、 &#8220;[&#8221; と &#8220;]&#8221; で囲まれた部分では、その間に何文字あっても PatLen が 1 だけ増えるということです。</p>
<p>&nbsp;</p>
<p>したがって、問題に示された &#8220;AC[BA]A[ABC]A&#8221; という具体例を処理したときの PatLen は、</p>
<ol class="background c-round">
<li>&#8220;AC&#8221; で 2 増える</li>
<li>&#8220;[BA]&#8221; で 1 増える</li>
<li>&#8220;A&#8221; で 1 増える</li>
<li>&#8220;[ABC]&#8221; で 1 増える</li>
<li>&#8220;A&#8221; で 1 増える</li>
</ol>
<p>全部で 6 になります。</p>
<p>したがって、空欄 h の正解は、選択肢イです。</p>
<p>&nbsp;</p>
<p>今度は、&#8221;A&#8221; のビットマスクを求める空欄 g です。</p>
<p>&#8220;AC[BA]A[ABC]A&#8221; において、<br />
&#8220;A&#8221; は 5 回登場し、 &#8220;[&#8221; と &#8220;]&#8221; で囲まれた部分では、その間に何文字あっても PatLen が 1 だけ増えるのですから、 &#8220;ACAAAA&#8221; を想定してビットマスクを求めればよいことになります。</p>
<p>&#8220;A&#8221; は、1 文字目、3 文字目、4 文字目、5 文字目、6 文字目に登場するので、それらの桁位置を 1 とした &#8220;111101&#8221;B というビットマスクになります。したがって、空欄 g の正解は、選択肢カです。</p>
<h2>秘訣 6：<br />少しぐらいできない問題があっても気にしない</h2>
<p>最後は、空欄 i です。</p>
<p>誤って Pat[] に &#8220;AC[B[AB]AC]A&#8221; が与えられた場合には、<br />
&#8220;[B[A&#8221; の部分で PatLen が 2 増えてしまうので、 &#8220;A&#8221; のビットマスクは、&#8221;ACBAACA&#8221; を想定して求められます。</p>
<p>&#8220;A&#8221; は、1 文字目、4 文字目、5 文字目、7 文字目に登場するので、それらの桁位置を 1 とした &#8220;1011001&#8221;B というビットマスクになります。</p>
<p>したがって、空欄 i の正解は、選択肢ウです。</p>
<p>&nbsp;</p>
<p>この空欄 i は、かなり難しいでしょう。</p>
<p>問題の 60 %以上が正解なら合格なのですから、「少しぐらいできない問題があっても気にしない」でください。</p>
<p>&nbsp;</p>
<p>最後に、問題の答えをまとめて示しておきます。</p>
<div class="chip">解答</div>
<p>設問 1　a &#8211; イ　b &#8211; ア　c &#8211; ア<br />
設問 2　d &#8211; イ　e &#8211; キ　f &#8211; カ<br />
設問 3　g &#8211; カ　h &#8211; イ　i &#8211; ウ</p>
<div class="divider mag_tp50 mag_bt30"></div>
<p>この記事の中で紹介した</p>
<div class="card-panel indigo-text bold z-depth-0 grey lighten-5 mag_h20">
「説明文とプログラムを対応付ける」<br />
「問題に示された具体例をヒントにして考える」<br />
「すぐに解けない設問は後回しにする」<br />
「具体例をコツコツとトレースすればできる」<br />
「設問に答えられればよいと割り切って解く」<br />
「少しぐらいできない問題があっても気にしない」
</div>
<p>という解法のテクニックと心構えは、午後問題の問 7 ～問 11 のプログラミング言語の問題でも応用できます。</p>
<p>ぜひお試しください。それでは、またお会いしましょう！</p>
<p>&nbsp;</p><p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/gogo_arukikata/analytics_question_pm_2019autumn/">こうすりゃ解ける！ 2019年度秋期 (令和元年度) 基本情報技術者試験の午後問題を徹底解説</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></content:encoded>
			</item>
		<item>
		<title>「厳選5題」過去問と解説 &#124; 平成28年度 秋期 の過去問やるならこれをやれ</title>
		<link>https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/kakomon-gensen/h28_autumn/</link>
		<pubDate>Tue, 07 May 2019 03:43:28 +0000</pubDate>
		<dc:creator><![CDATA[矢沢 久雄]]></dc:creator>
				<category><![CDATA[2019見直し]]></category>
		<category><![CDATA[2のべき乗]]></category>
		<category><![CDATA[FIFO LRU LFU]]></category>
		<category><![CDATA[マスク]]></category>
		<category><![CDATA[午前問題]]></category>
		<category><![CDATA[確率]]></category>
		<category><![CDATA[計算問題]]></category>
		<category><![CDATA[過去問演習]]></category>
		<category><![CDATA[音声サンプリング]]></category>

		<guid isPermaLink="false">https://www.seplus.jp/dokushuzemi/fe/fenavi/?post_type=kakomon-gensen&#038;p=1156</guid>
		<description><![CDATA[<p>ここでは、平成 28 年度 秋期 基本情報技術者試験の午前試験 の中から「やるべき問題」を5題に厳選し、ぶっちゃけた解説をさせていただきます。 やるべき問題とは、よく出る問題であり、かつ、練習すればできる問題（練習しない [&#8230;]</p>
<p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/kakomon-gensen/h28_autumn/">「厳選5題」過去問と解説 | 平成28年度 秋期 の過去問やるならこれをやれ</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>ここでは、<a href="https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2016h28_2/2016h28a_fe_am_qs.pdf" rel="noopener" target="_blank">平成 28 年度 秋期 基本情報技術者試験の午前試験</a> の中から「やるべき問題」を5題に厳選し、ぶっちゃけた解説をさせていただきます。</p>
<p>やるべき問題とは、よく出る問題であり、かつ、練習すればできる問題（練習しないとできない問題）です。</p>
<style>h2 .chip{vertical-align:middle;background:#3f51b5;color:white;margin-right:.75em;}.chip i{font-size:2em!important;}dl.inline dd{margin-left:2em;}</style>
<h2><span class="chip">厳選問題<i class="material-icons mag_lt05">looks_one</i></span>AND によるビット演算のイメージをつかんでおこう</h2>
<div class="card-panel mag_h30">
問 1　(平成 28 年度 秋期)</p>
<p>8 ビットのビット列の下位 4 ビットが変化しない操作はどれか。</p>
<dl class="inline">
<dt>ア</dt>
<dd>16 進表記 0F のビット列との排他的論理和をとる。 </dd>
<dt>イ</dt>
<dd>16 進表記 0F のビット列との否定論理積をとる。 </dd>
<dt>ウ</dt>
<dd>16 進表記 0F のビット列との論理積をとる。 </dd>
<dt>エ</dt>
<dd>16 進表記 0F のビット列との論理和をとる。 </dd>
</dl>
</div>
<div class="chip">解説</div>
<p>この問題は、「ビット演算（マスク演算とも呼ばれる）」がテーマです。 <span class="u">ビット演算 とは、 2 進数のデータを論理演算すること</span>です。</p>
<p>説明するより具体例を示した方が早いと思いますので、以下を見てください。</p>
<figure>
<img class="materialboxed hoverable responsive-width" src="../../wp-content/uploads/2019/05/and1.png" alt="" loading="lazy" /><br />
</figure>
<p>01010101 と 00001111 という 2 進数で AND 演算を行っています。</p>
<p>01010101 には<span class="bold">「データ」</span>、 00001111 には<span class="bold">「マスク」</span>という名前を付けています。 これらの名前の意味は、あとでわかります。</p>
<p>ビット演算では、 2 進数の 1 桁ずつで論理演算をします。</p>
<figure>
<img class="materialboxed hoverable responsive-width" src="../../wp-content/uploads/2019/05/and2.png" alt="" loading="lazy" /><br />
</figure>
<p>ここでは、 AND 演算ですから、以下の矢印の方向でデータとマスクの 1 桁ずつを AND 演算します。 AND 演算は、演算する 2 つの値が両方とも 1 のときだけ演算結果が 1 になります。 ここまでは、OK でしょうか？</p>
<p>&nbsp;</p>
<p>それでは、あらためてデータ、マスク、演算結果を見てみましょう。</p>
<figure>
<img class="materialboxed hoverable responsive-width pad_05" src="../../wp-content/uploads/2019/05/and3.png" alt="" loading="lazy" /><br />
</figure>
<p>データの 01010101 のうち、マスクの 00001111 の 0 の部分に対応する桁が 0 になり、 1 の部分に対応する桁が変化せずに、 00000101 という演算結果が得られました。</p>
<p>これは、 00001111 というマスクで、 01010101 というデータの上位 4 桁を覆い隠した（マスクした）といえます。</p>
<p>だから、 01010101 を データ と名付け、 00001111 を マスク と名付けたのです。</p>
<p>&nbsp;</p>
<p>このようなマスクができるのは、</p>
<ul class="background c-round">
<li>0 と AND 演算をすれば、相手が 0 でも 1 でも 0 になり（必ず 0 になる）</li>
<li>1 と AND 演算をすれば、相手が 0 なら 0 になり、相手が 1 なら 1 になる（変化しない）</li>
</ul>
<p>からです。</p>
<p>納得していただけましたね！</p>
<p>&nbsp;</p>
<p>それでは、問題を見てみましょう。</p>
<blockquote>
<p class="grey-text">「 8 ビットのビット列の下位 4 ビットが変化しない操作はどれか」</p>
</blockquote>
<p>ですから、これは、これまで説明してきた「 00001111 と AND 演算する」です。</p>
<p>選択肢では、 2 進数を 16 進数 表記し、論理演算の種類を日本語で示しています。 00001111 を 16 進数表記すると 0F です。 AND 演算を日本語で示すと 論理積 です。</p>
<p>したがって、選択肢ウの「 16 進数表記 0F のビット列との 論理積 をとる」が正解です。</p>
<p><span class="chip mag_tp30 mag_rt10">解答</span>ウ</p>
<p class="grey-text mag_tp30"><i class="material-icons light-blue-text">search</i><span class="blue-grey-text mag_w10">タグで関連記事をチェック</span><a class="tag" href="../../tag/マスク">マスク</a></p>
<h2><span class="chip">厳選問題<i class="material-icons mag_lt05">looks_two</i></span>今後の試験で出題比率が多くなる「数学」の問題をやっておこう</h2>
<div class="card-panel mag_h30">
問 2　(平成 28 年度 秋期)</p>
<p>ある工場では，同じ製品を独立した二つのライン A，B で製造している。 ライン A では製品全体の 60 % を製造し，ライン B では 40 % を製造している。 ライン A で 製造された製品の 2 % が不良品であり，ライン B で製造された製品の 1 % が不良品で あることが分かっている。 いま，この工場で製造された製品の一つを無作為に抽出して調べたところ，それは不良品であった。 その製品がライン A で製造された確率は何 % か。</p>
<p>ア　40　　イ　50　　ウ　60　　エ　75
</p></div>
<p>基本情報技術者試験を実施している情報処理推進機構のニュースリリースによると</p>
<blockquote class="bold"><p>「 2019 年の秋期試験から、午前試験で数学に関する出題比率を見直し、<span class="bold">線形代数、確率、統計</span>等、数学に関する出題比率を多くする」</p></blockquote>
<p>そうです。</p>
<div class="divider mag_tp40"></div>
<p class="grey-text small-text"><i class="material-icons">info_outline</i> 関連記事</p>
<p><a href="../../guide/focus_on_diff_2/"></p>
<div class="row valign-wrapper pad_w20">
<div class="col s3 m2 pad_00"><img src="../../wp-content/uploads/2019/06/syllabus_fe_diff-300x180.jpg" loading="lazy"></div>
<div class="col s9 m10 bold pad_lt10">基本情報技術者試験の 2019 シラバス改訂 で注目すべきポイント (用語解説付き)</div>
</div>
<p></a></p>
<div class="divider mag_bt40"></div>
<p>したがって、今後受験を予定されている人は、これまで以上に数学に関する過去問題を数多く練習しておくべきです。 そんなわけで、この問題を取り上げました。</p>
<p>テーマは、<span class="bold">「確率」</span>です。</p>
<div class="chip mag_tp30">解説</div>
<p>基本情報技術者試験で要求される数学の知識は、だいたい中学レベルです。 何らかの事例に仕立てたような問題が出題されるので、一見して難しそうに感じるかもしれませんが、必ずできますので、自信を持って解いてください。</p>
<p>それでは、やってみましょう。</p>
<p>ライン A は、製品全体の 60 % を製造し、その 2 % が不良品なので、<br />
ライン A の不良品は、全体の<br />
<i class="material-icons blue-text mag_rt05">chevron_right</i>0.6 × 0.02 = 0.012 = 1.2 %<br />
です。</p>
<p>ライン B は、製品全体の 40 % を製造し、その 1 % が不良品なので、<br />
ライン B の不良品は、全体の<br />
<i class="material-icons blue-text mag_rt05">chevron_right</i>0.4 × 0.01 = 0.004 = 0.4 %<br />
です。</p>
<p>不良品は、全部で<br />
<i class="material-icons blue-text mag_rt05">chevron_right</i>1.2 % + 0.4 % = 1.6 %<br />
になります。</p>
<p>無造作に抽出した不良品が ライン A で製造された確率は、全体の不良品の 1.6 % のうち、ライン A の不良品が 1.2 % なのですから、</p>
<p><i class="material-icons blue-text mag_rt05">chevron_right</i>1.2 ÷ 1.6 = 0.75 = 75 %</p>
<p>という計算で求められます。</p>
<p>正解は、選択肢エです。</p>
<p>やったあ！ できたあ！</p>
<p><span class="chip mag_tp30 mag_rt10">解答</span>エ</p>
<h2><span class="chip">厳選問題<i class="material-icons mag_lt05">looks_3</i></span>2 のべき乗は指折り数えて計算しよう</h2>
<div class="card-panel mag_h30">
問 4　(平成 28 年度 秋期)</p>
<p>32 ビットで表現できるビットパターンの個数は， 24 ビットで表現できる個数の何倍か。</p>
<p>ア　8　　イ　16　　ウ　128　　エ　256
</p></div>
<p>問題に示された「ビットパターン」とは、 2 進数のデータのパターンのことです。</p>
<p>当然のことですが、ビット数（ 2 進数の桁数）が多いほど、表現できるビット数が多くなります。</p>
<p>&nbsp;</p>
<p>たとえば、</p>
<p>1 ビットで表現できるビットパターンは、<br />
0 と 1 の 2 通りです。</p>
<p>2 ビットで表現できるビットパターンは、<br />
00 、 01 、 10 、 11 の 4 通り です。</p>
<p>3 ビットで表現できるビットパターンは、<br />
000 、 001 、 010 、 011 、 100 、 101 、 110 、 111 の 8 通りです。</p>
<p>1 ビット で 2 通り、 2 ビット で 4 通り、 3 ビット で 8 通りなのですから、 1 ビット増えるごとに、表現できるビットパターンが 2 倍になります。</p>
<p>これまでのビットパターンにもう 1 ビット 増やしたら、増やした部分を 0 にしたビットパターンと、 1 にしたビットパターンが作れるので、 2 倍になって当然です。</p>
<p>以下の図を見て<span class="bold">「1 ビット増えるごとに、表現できるビットパターンが 2 倍になる」</span>ということを覚えてください。</p>
<figure>
  <img class="materialboxed hoverable responsive-width pad_05" src="../../wp-content/uploads/2019/05/bit.png" alt="" loading="lazy" /><br />
</figure>
<div class="chip mag_tp30">解説</div>
<p>それでは、問題を見てみましょう。</p>
<p>32 ビットは、 24 ビットと比べて、 32 &#8211; 24 = 8 ビット多いです。 8 ビット多いと何倍になるか、指折り数えてみましょう。</p>
<p>「 2 倍」<br />
「 4 倍」<br />
「 8 倍」<br />
「 16 倍」<br />
「 32 倍」<br />
「 64 倍」<br />
「 128 倍」<br />
「 256 倍」</p>
<p>ですから、 256 倍になります。 したがって、正解は、選択肢エです。</p>
<p><span class="chip mag_tp30 mag_rt10">解答</span>エ</p>
<p class="grey-text mag_tp30"><i class="material-icons light-blue-text">search</i><span class="blue-grey-text mag_w10">タグで関連記事をチェック</span><a class="tag" href="../../tag/2のべき乗">2 のべき乗</a></p>
<h2><span class="chip">厳選問題<i class="material-icons mag_lt05">looks_4</i></span>A / D 変換に関する 3 つの用語をまとめて覚えよう</h2>
<div class="card-panel mag_h30">
問 5　(平成28年度秋期)</p>
<p>標本化，符号化，量子化の三つの工程で、アナログをディジタルに変換する場合の順番として，適切なものはどれか。</p>
<p>ア　標本化，量子化，符号化　　イ　符号化，量子化，標本化<br />
ウ　量子化，標本化，符号化　　エ　量子化，符号化，標本化
</p></div>
<div class="chip">解説</div>
<p>自然界にあるアナログデータを、コンピュータで処理できるディジタルデータに変換することを<span class="bold">「 A / D 変換（ Analog / Digital 変換）」</span>と呼びます。</p>
<p>基本情報技術者試験によく出る A / D 変換は、音声のアナログデータをディジタルデータに変換することなので、それをイメージするとよいでしょう。</p>
<p>この問題は、 <span class="u">A / D 変換で行われる「標本化」「符号化」「量子化」が、どの順番で行われるかを問うもの</span>です。 こういうことは、腕を組んで考えてわかることではありません。 説明を読んで覚えることです。</p>
<p>&nbsp;</p>
<p><span class="bold">最初に行われるのは「標本化」</span>です。</p>
<p>日本人が「標本」と聞くと、昆虫採集を思い浮かべるかもしれませんが、これは「サンプリング（ sampling ）」という英語を日本語に直訳したものです。</p>
<p>標本化は、アナログのデータを一定時間間隔でぶち切れのデータとして記録することです。 記録することを「標本化」と呼んでいるのです。</p>
<p>&nbsp;</p>
<p><span class="bold">次に行われるのは「量子化（ quantization ）」</span>です。</p>
<p>これは、標本化されたデータを、基準となる数値（これが量子です）の整数倍に置き換えることです。 たとえば、 1 を量子とすれば、その整数倍の 1 、 2 、 3 、 4 、 5 、 6 、 7 ・・・にします。</p>
<p>この場合には、たとえば、標本化された 6.5 は 7 に、 5.3 は 5 に量子化するのが適切でしょう。 ここでは、四捨五入して整数にしています。</p>
<p>&nbsp;</p>
<p><span class="bold">最後に行われるのは、「符号化（ coding ）」</span>です。</p>
<p>これは、量子化されたデータを、あらかじめ決めておいた形式の 2 進数のデータ（ 2 進数の符号）にすることです。 たとえば、8 ビットにすると決めておいたなら、量子化された 7 は 00000111 に符号化され、 5 は 00000101 に符号化されます。</p>
<p>符号とは、コンピュータで処理できる 2 進数のデータを意味しています。</p>
<p>&nbsp;</p>
<p>以上のことから、 A / D 変換の手順は、「標本化」→「量子化」→「符号化」です。</p>
<p>したがって、選択肢アが正解です。</p>
<p><span class="chip mag_tp30 mag_rt10">解答</span>ア</p>
<p class="grey-text mag_tp30"><i class="material-icons light-blue-text">search</i><span class="blue-grey-text mag_w10">タグで関連記事をチェック</span><a class="tag" href="../../tag/音声サンプリング">音声サンプリング</a></p>
<h2><span class="chip">厳選問題<i class="material-icons mag_lt05">looks_5</i></span>とにかくよく出る FIFO 、 LRU 、 LFU の意味をしっかり覚えよう</h2>
<div class="card-panel">
問 19　(平成 28 年度 秋期)</p>
<p>LRU アルゴリズムで、ページ置換えの判断基準に用いられる項目はどれか。</p>
<p>ア　最後に参照した時刻　　イ　最初に参照した時刻<br />
ウ　単位時間当たりの参照頻度　　エ　累積の参照回数
</p></div>
<div class="chip">解説</div>
<p>この問題を見て「キター！」と思いました。 仮想記憶のページングアルゴリズムである FIFO 、 LRU 、 LFU は、とにかくよく出る問題だからです。</p>
<p>これらは、実メモリ（主記憶）が一杯になったときに、今後使われる可能性が低いページ（記憶領域を固定的なサイズで区切った部分）を、仮想メモリ（補助記憶装置）に追い出すときのアルゴリズムです。</p>
<p>アルゴリズムといっても、処理の手順ではなく、今後使われる可能性が低いページを決める方法のことです。</p>
<p>&nbsp;</p>
<p>FIFO 、 LRU 、 LFU は、どれかが優れているというわけではなく、どれもごもっともな方法です。 どれが効果的なのかは、状況次第でしょう。 それぞれの用語が、何の略なのかを知り、それを日本語に直訳して意味を覚えてください。</p>
<dl class="background c-round">
<dt class="bold">FIFO</dt>
<dd>First In First Out の略で、「先に入ったものを先に出す」という意味です。</p>
<p>先に実メモリに入ったページは古いのですから、今後使われる可能性が低いと判断するのです。 ごもっともな方法です。</dd>
<dt class="bold">LRU</dt>
<dd>Recently Used の略で、「最近使っていない」という意味です。</p>
<p>最後に使ってから最も時間が経過しているページは、今後使われる可能性が低いと判断するのです。 これも、ごもっともな方法です。 Least は、 Little の最上級で「最も～でない」を意味します。 Recently は、「最近」という意味です。</dd>
<dt class="bold">LFU</dt>
<dd>Least Frequently Used の略で、「頻繁に使っていない」という意味です。</p>
<p>使われた回数が少ないページは、今後使われる可能性が低いと判断するのです。 これも、ごもっともな方法です。 Frequently は、「頻繁に」という意味です。</dd>
</dl>
<p>それでは、問題を見てみましょう。 LRU の判断基準を選ぶのですから「最後に使われた時間」です。</p>
<p>したがって、選択肢アの「最後に参照した時刻」が正解です。</p>
<p><span class="chip mag_tp30 mag_rt10">解答</span>ア</p>
<div class="divider mag_tp40 mag_bt10"></div>
<p class="grey-text small-text"><i class="material-icons mag_rt05">info_outline</i>FIFO / LRU / LFU に関する詳しい記事</p>
<p><a href="../../mastering_tech/fifo_lfu_lru/"></p>
<div class="row valign-wrapper pad_w20">
<div class="col s3 m2 flex pad_00"><img src="../../wp-content/uploads/2020/10/cover_fifo_lfu_lru.jpg" loading="lazy" /></div>
<div class="col s9 m10 pad_10 blue-grey-text bold">基本情報でわかる FIFO LFU LRU 「略語の意味がわかればわかる」</div>
</div>
<p></a></p>
<div class="divider mag_to50 mag_bt30"></div>
<p>記事をお読みいただきありがとうございます。</p>
<p>もしも、一度解いただけでは、よくわからない問題があったなら、わかるまで何度でも練習してください。 <span class="bold">「やるべき問題」は「わかるまでやるべき問題」</span>だからです。</p>
<p>この厳選問題大全集が、受験者の皆様のお役に立てば幸いです。</p>
<p>&nbsp;</p><p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/kakomon-gensen/h28_autumn/">「厳選5題」過去問と解説 | 平成28年度 秋期 の過去問やるならこれをやれ</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></content:encoded>
			</item>
		<item>
		<title>午後問題の歩き方 ｜ CASLⅡで必要となる2進数に関する知識</title>
		<link>https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/gogo_arukikata/guide_caslii_2_of_questions_at_pm/</link>
		<pubDate>Mon, 20 Aug 2018 05:22:28 +0000</pubDate>
		<dc:creator><![CDATA[矢沢 久雄]]></dc:creator>
				<category><![CDATA[2進数]]></category>
		<category><![CDATA[CASL II]]></category>
		<category><![CDATA[マスク]]></category>
		<category><![CDATA[午後プログラミング言語問題]]></category>
		<category><![CDATA[午後問題の解説]]></category>
		<category><![CDATA[論理回路]]></category>

		<guid isPermaLink="false">http://www.seplus.jp/dokushuzemi/fe/fenavi/?post_type=gogo_arukikata&#038;p=388</guid>
		<description><![CDATA[<p>前回の記事 では、 「 CASLⅡの言語構文を覚えるだけなら、それほど時間はかかりません（簡単です）」 「ただし、問題を解くには、2 進数に関する様々な知識が必要 とされます（それほど簡単ではありません）」 ということを [&#8230;]</p>
<p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/gogo_arukikata/guide_caslii_2_of_questions_at_pm/">午後問題の歩き方 ｜ CASLⅡで必要となる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><a href="../guide_caslii_1_of_questions_at_pm/">前回の記事</a> では、</p>
<blockquote>
<ul>
<li>「 CASLⅡの言語構文を覚えるだけなら、それほど時間はかかりません（簡単です）」</li>
<li>「<span class="bold">ただし、問題を解くには、2 進数に関する様々な知識が必要</span> とされます（それほど簡単ではありません）」</li>
</ul>
</blockquote>
<p>ということを説明しました。</p>
<p>今回は、過去問題に出題されたプログラムを例にして、<span class="bold">どのような知識が、どのような場面で必要とされるのか</span> を説明します。</p>
<p>CASLⅡを選ぼうかどうか迷っている人の参考になれば幸いです。</p>
<ul class="background c-round blue-grey-text">
<span class="small-text"><i class="material-icons light-blue-text mag_rt05">error</i>編集部注</span></p>
<li>本記事ではわかりやすいよう、プログラムの問題に背景を入れています。</li>
<li class="hide-on-med-and-up">スマートフォンでご覧の際、計算式やプログラムは横スクロールすると全文をご覧になれます。</li>
</ul>
<style>ul.background li{font-size:.9em}pre{font-family:'consolas','Courier New',"HCo Gotham SSm",Gotham,"ヒラギノ角ゴ Pro W3","Hiragino Kaku Gothic ProN","Hiragino Sans","BIZ UDPGothic",Meiryo,sans-serif!important;background:#2d2d2d;color:#fbfbfb}article pre:not(.line-numbers){margin-right:-7.5%!important;margin-left:-7.5%!important;padding-left:7.5%!important}article pre.line-numbers{margin-right:-7.5%!important;margin-left:-7.5%!important}.r-width{width:50%;margin:auto}@media screen and (max-width:600px){.r-width{width:100%}}.border{padding:.2em 4em;border:.2em solid #fff;font-weight:700;display:inline-block;margin:.2em}ol.background li{margin-left:1.5em}.img-background{background-size:100%;background-position:center;background-repeat:no-repeat;transition:background-size .4s ease-in-out}.inner{background:#09090980;color:#fff;padding:2.5em 1.25em;border-radius:.5em;transition:color .4s ease-in-out;font-weight:700}.img-background:hover{background-size:110%;transition:background-size .4s ease-in-out}.img-background:hover .inner{color:#40c4ff;transition:color .4s ease-in-out}.ccc{color:#ccc}</style>
<h2>シフトと加算で乗算を行う手順を知っていますか？</h2>
<p><a href="https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2009h21_1/2009h21h_fe_pm_qs.pdf#page=50" rel="noopener" target="_blank">平成 21 年度 春期 午後 問 12</a>  のテーマは「 32 ビットの乗算」です。</p>
<div class="card-panel mag_h30">
問 12</p>
<p>次のアセンブラプログラムの説明及びプログラムを読んで，設問 1 ，2 に答えよ。</p>
<p>【プログラムの説明】<br />
32 ビットの乗算を行う副プログラム MULS である。<br />
&#x205D;
</p></div>
<p>この問題を解くには、<span class="u">シフトと加算で 2 進数の乗算を行う手順を知っていなければなりません。</span></p>
<p>以下にシンプルな例題を示したので、手作業でやってみてください。演算結果は、初期状態でゼロクリアされているとします。</p>
<div class="chip" style="height: auto; line-height: 2;"><i class="material-icons light-blue-text mag_rt05">code</i>〔例題〕シフトと加算で 2 進数の乗算を行う</div>
<pre class="pad_h10 ccc">
  00000000000000000000000000001111  被乗数
× 00000000000000000000000000000101  乗数
------------------------------------
  00000000000000000000000000000000  演算結果
</pre>
<p>まず、乗数 の 最下位桁 が 1 なら 演算結果 に 被乗数 を 加算 します。</p>
<p>次に、乗数 を 1 ビット論理右シフト して、次にチェックする桁を 最下位桁 に移動します。<br />
そして、次の 加算 に合わせて、被乗数 を 1 ビット論理左シフト します。</p>
<p>これを、乗数 が 0 になるまで繰り返します。</p>
<pre class="pad_h10 ccc">
  00000000000000000000000000001111  被乗数
× 00000000000000000000000000000101  乗数
------------------------------------
  00000000000000000000000000001111
+ 00000000000000000000000000111100
------------------------------------
  00000000000000000000000001001011  演算結果
</pre>
<p>この手順は、平成 21 年度 春期 だけでなく、何度も出題されています。</p>
<h2>最下位桁が 1 かどうかチェックする方法がわかりますか？</h2>
<p>先ほどの問題を解くための知識の説明を続けます。シフト と 加算 で 乗算 を行う手順の中で、乗数 の 最下位桁 が 1 かどうかをチェックします。</p>
<p>以下は、問題に示されたプログラムの一部です。</p>
<div class="chip"><i class="material-icons light-blue-text mag_rt05">code</i>プログラム 1</div>
<pre class="language-none">
LP      SRL     GR2,1   ; 乗数を 1 ビット右にシフト
        <span class="border">a</span>
        JZE     FIN
        JUMP    NEXT    ; 加算処理をスキップ
ADD32   ADDL    GR6,GR4 ; 32 ビット + 32 ビット → 32 ビット
        ADDL    GR7,GRS
</pre>
<p>GR2 に格納されている  乗数を 1 ビット論理右シフトした後で、空欄 a には 最下位桁 が 1 なら ADD32 というラベルにジャンプする処理が入ります。</p>
<p>選択肢から答えを選ぶには、最下位桁 が 1 であることを判断する方法を知っていなければなりません。</p>
<div class="card-panel mag_h50">
a に関する解答群</p>
<p>ア　<code class="language-none"> JMI　ADD32 </code>　　<br class="hide-on-med-and-up">イ　<code class="language-none"> JMI　LP　</code><br />
ウ　<code class="language-none"> JOV　ADD32 </code>　　<br class="hide-on-med-and-up">エ　<code class="language-none"> JOV　LP　</code><br />
オ　<code class="language-none"> JPL　ADD32 </code>　　<br class="hide-on-med-and-up">カ　<code class="language-none"> JPL　LP　</code>
</div>
<p>答えは、選択肢ウ の JOV ADD32 です。</p>
<p>&nbsp;</p>
<p>最下位桁 が 1 なら、論理右シフト によって、その 1 がはみ出します。それを JOV（ Jump OVerflow, オーバーフローならジャンプする）で判断するのです。</p>
<p>一般的な感覚では、上位桁 からはみ出すことが オーバーフロー（桁あふれ）ですが、コンピュータでは、<span class="bold">下位桁 からはみ出すこともオーバーフロー</span> なのです。</p>
<p>&nbsp;</p>
<p>なお、別の年度の問題では、論理右シフト することではなく、「 #0001 と AND 演算した結果が ゼロ でないなら 最下位桁 が 1 である」と判断するプログラムが出題されたこともあります。</p>
<p>いろいろな方法があるので、 1 つに決め付けないようにしましょう。</p>
<h2>ビット演算で数値を数字に変換する方法がわかりますか？</h2>
<p>次の例は、<a href="https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2013h25_2/2013h25a_fe_pm_qs.pdf#page=60" rel="noopener" target="_blank">平成 25 年度 秋期 午後 問 12「数字列の時間と数値の秒との変換」</a> です。</p>
<p>この問題を解くには、<span class="bold">ビット演算で 1 桁の数値を数字に変換する</span> 方法を知っていなければなりません。</p>
<p>&nbsp;</p>
<p>プログラムの中で、該当する部分を以下に示します。たったの 1 行だけです。空欄 c の選択肢には、レジスタ の名前が示されています。</p>
<p>レジスタの名前を選ぶには、この処理を見て<span class="bold">「 1 桁 の数値を 数字に変換する処理 だ！」</span> とピンと来なければなりません。</p>
<div class="chip"><i class="material-icons light-blue-text mag_rt05">code</i>プログラム 2</div>
<pre class="language-none">
18 |　　      OR    <span style="padding:.2em 2em;border:.2em solid #fff;font-weight:700;display:inline-block;margin:.2em">c</span> ,='0'
</pre>
<p>&nbsp;</p>
<p>以下は、試験問題に添付されている文字の符号表です。</p>
<p><img class="materialboxed hoverable mag_h30" src="../../wp-content/uploads/2018/08/Q12_h25_table.png" alt="" /></p>
<p>&#8216;0&#8217; ～ &#8216;9&#8217; という数字（文字）には、#30 ～ #39（先頭の # は、16 進数であることを意味します）という符号が割り当てられています。</p>
<p>したがって、たとえば GR0 に 0 ～ 9 の数値が格納されていれば、それと #30 を OR 演算することで、#30 ~ #39 という数字に変換できます。</p>
<p>#30 は、 &#8216;0&#8217; の文字コードなので、このプログラムでは、</p>
<pre class="language-none">
    OR    GR0,=#30
</pre>
<p>という処理を、</p>
<pre class="language-none">
    OR    GR0,='0'
</pre>
<p>と表記しています。</p>
<p>「 &#8216;0&#8217; の文字コードと OR 演算しているんだから、何をやっているかわかるよね！」というヒントなのでしょう（たぶん）。</p>
<p>このような知識は、1 つひとつ確実に覚えていきましょう。そうすれば、他の問題で応用ができます。</p>
<p>&nbsp;</p>
<p>たとえば、以下は<a href="https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2018h30_1/2018h30h_fe_pm_qs.pdf#page=63" rel="noopener" target="_blank">平成 30 年度 春期 午後 問 12「数字列の数値への変換」</a>に出題されたプログラムの一部です。</p>
<p>先ほど覚えた知識があれば、これを見て、すぐに何をしているのかピンと来たでしょう。</p>
<div class="chip"><i class="material-icons light-blue-text mag_rt05">code</i>プログラム 1</div>
<pre class="line-numbers" data-start="8"><code class="language-none">    SUBL  GR4,='0'  ; 1 桁を数値に変換</code></pre>
<p>ご丁寧にコメントも付けられていますが、この処理は、GR4 に格納されている 数字 を 数値 に 変換 しています。</p>
<p>たとえば、GR4 に &#8216;5&#8217; という数字の符号の #35 が格納されているとすれば、そこから &#8216;0&#8217; の符号の #30 を引くことで、数値の 5 に変換できます。</p>
<p>この変換は、</p>
<pre class="language-none">
    AND   GR4,#000F
</pre>
<p>と ビット演算 でもできますが、SUBL という 減算 を使っているのは、出題者の好みなのでしょう。</p>
<h2>#FFFF が 2 進数でいくつか、すぐにわかりますか？</h2>
<p>ビット演算 を行うには、 <span class="bold">マスク</span> を作る必要があります。</p>
<p>マスクとは、たとえば、0101010101010101 の下位 8 ビットを取り出すときには、</p>
<pre class="pad_h10 ccc">
    0101010101010101
AND 0000000011111111
</pre>
<p>という ビット演算 を行いますが、このときの 0000000011111111 というパターンのことです。</p>
<p>&nbsp;</p>
<p>以下は、<a href="https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2017h29_2/2017h29a_fe_pm_qs.pdf#page=64" rel="noopener" target="_blank">平成 29 年度 秋期 午後 問 12「ビット列の検索・置換」</a> に出題されたプログラムの一部です。</p>
<p>「マスク作成」というコメントにあるように、GR6 に マスク を作成しています。</p>
<p>仮に、GR3 の値が 10 進数 で 8 だとしたら、GR6 には、どのようなパターンのマスクが作られるでしょう。トレースしてみてください。</p>
<div class="chip"><i class="material-icons light-blue-text mag_rt05">code</i>プログラム 1</div>
<pre class="line-numbers" data-start="4">
<code class="language-none">    LD    GR6,=#FFFF  ; マスク作成
    SRL   GR6,0,GR3
    XOR   GR6,=#FFFF</code>
</pre>
<p>マスクのパターンを見出すには、<span class="bold">#FFFF という 16 進数が、2 進数で 1111111111111111</span> であることを知っておくべきです。</p>
<ol class="background c-round">
<li>4 行目で GR6 に 1111111111111111 が格納される</li>
<li>5 行目で GR6 が 8 ビット右論理シフト されて 0000000011111111 になる</li>
<li>6 行目で GR6 の 0000000011111111 と 1111111111111111 が XOR 演算される</li>
<li>GR6 は 1111111100000000 になる</li>
</ol>
<p>この時点の GR6 の内容が マスク です。</p>
<p>&nbsp;</p>
<p>6 行目にも知っておくべき知識があります。</p>
<p>CASLⅡ の論理演算の命令は、AND 演算、OR 演算、XOR 演算だけであり、データを反転する NOT 演算がありません。</p>
<p>NOT 演算を行いたい場合は、すべての桁 が 1 の マスク と XOR 演算することで代用します。</p>
<p>すべての桁 が 1 のデータは、16 進数で #FFFF です。6 行目の </p>
<pre class="line-numbers" data-start="6"><code class="language-none"> XOR   GR6,=#FFFF </code></pre>
<p>を見て <span class="bold">「これはデータの反転だ！」とわかるようになりましょう。</span></p>
<div class="grey lighten-5 mag_h30 pad_20 c-round">
<i class="material-icons light-blue-text">search</i><span class="blue-grey-text mag_w10">タグで関連記事をチェック</span><a href="../../tag/マスク/" class="tag">マスク</a>
</div>
<h2>#FFFF が 2 の補数表現 でマイナス 1 だとすぐにわかりますか？</h2>
<p>最後に、もう一度だけ、目的を実現する方法を 1 つに決め付けないようにしましょう、ということを言っておきたいので、以下のプログラムを見てください。</p>
<p>これは、<a href="https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2011h23_2/2011h23a_fe_pm_qs.pdf#page=56" rel="noopener" target="_blank">平成 23 年度 秋期 午後 問 12「除算と2 進 10 進数文字列変換」</a> に出題されたプログラムの一部です。</p>
<p>注目してほしいのは、<span class="bold">「商の初期化」</span> とコメントされた部分にある #FFFF です。</p>
<div class="chip"><i class="material-icons light-blue-text mag_rt05">code</i>プログラム 1</div>
<pre>
<code class="language-none">DIV   START               ; 減算を用いた 32 ビット除算
      PUSH    0,GR6
      PUSH    0,GR7
      LD      GR6,GR1
      LD      GR7,GR2
      LD      GR1,=#FFFF  ; 商の初期化
      LD      GR2,=#FFFF
LP    LD      GR4,GR6
      LD      GR5,GR7
      ADDL    GR2,=1      ; 商のカウントアップ</code>
</pre>
<p>先ほども説明したように、#FFFF という 16 進数は、 2 進数 で 1111111111111111 です。</p>
<p>それでは、この 1111111111111111 は、マスク を作るためのデータなのでしょうか。</p>
<p>&nbsp;</p>
<p>ここでは、違います。</p>
<p>1111111111111111 は、<span class="bold">2 の補数表現 の -1</span> です。</p>
<p>すべての桁が 1 の 2 進数を見て「 2 の補数表現 で -1 だ」とわかるようになってください。</p>
<p>それを <span class="bold">16 進数で示した #FFFF を見ても「これは -1 だ」とわかるようになりましょう</span>。</p>
<p>これも、知っておくべき重要な知識です。</p>
<p>&nbsp;</p>
<p>この問題では、引き算 を繰り返して、被除数 から 除数 を引けた回数を 商（除算の結果）とします。</p>
<p>それなら、「商の初期化」とコメントされた部分では、商を格納するレジスタをゼロクリアするべきです。</p>
<p>ところが、このプログラムでは、繰り返し処理の先頭（「商のカウントアップ」とコメントされた部分）で、引き算を行う前に、商をカウントアップしています。ここで -1 が ゼロになる のでつじつまが合うのです。</p>
<p>ちょっと、わかりにくいですね。</p>
<p>&nbsp;</p>
<p>そもそも、CASLⅡ では、= の後に 10 進数を記述することもできるので、商を -1 で 初期化 するなら、= #FFFF ではなく、= -1 と表記すべきです（これは、筆者の個人的な意見です）。</p>
<p>ここも、わかりにくいですね。</p>
<p>&nbsp;</p>
<p>でも、そういう問題が出題されているのですから、あれこれ文句を言わずに、とにかく練習あるのみです。</p>
<div class="grey lighten-5 mag_h30 pad_20 c-round">
<i class="material-icons teal-text">search</i><span class="blue-grey-text mag_w10">タグで関連記事をチェック</span><a href="../../tag/2進数/" class="tag">2進数</a>
</div>
<p>&nbsp;</p>
<div class="divider mag_h30"></div>
<p>実際の試験に出題された 2 進数の知識を見て、どう思いましたか？</p>
<p>「これなら、できそうだ！」と思った人は、迷わず CASLⅡ を選んでください。本試験に向けて、CASLⅡの過去問題をドンドン練習してください。</p>
<p><span class="bold">それとは逆に「こりゃ、だめだ！」と思った人は、本試験まで時間がなければ、CASLⅡをキッパリと断念して、別の言語を選びましょう</span>。</p>
<p>次回は、表計算の学習手順と、問題を解くために必要とされる知識を説明しますので、参考にしてください。</p>
<p><a href="../guide_spreadsheet_1_of_questions_at_pm/"></p>
<div class="card mag_h50 hoverable c-round">
<div class="row valign-wrapper direction-column-on-small">
<div class="col m3 s12 pad_00 flex"><img src="../../wp-content/uploads/2018/08/light-spreadsheet_cover.jpg" loading="lazy"></div>
<div class="col m9 s12 pad_20 bold black-text">表計算も簡単ではなくプログラミング問題（1）基礎知識</div>
</div>
</div>
<p></a></p>
<p>それでは、またお会いしましょう！</p>
<p>&nbsp;</p>
<p><i class="material-icons indigo-text mag_rt05">label</i>そのほかのプログラミング言語の記事</p>
<div class="row">
<div class="col m6">
<a href="../how_about_python/"></p>
<div class="img-background" style="background-image: url('../../wp-content/uploads/2019/01/python_cover.png');">
<div class="inner">「基本情報 の Python ってどんな感じ？」を解説｜午後問題の歩き方</div>
</div>
<p></a>
</div>
<div class="col m6">
<a href="../guide_java_1_of_questions_at_pm/"></p>
<div class="img-background" style="background-image: url('../../wp-content/uploads/2018/08/java_logo.jpg');">
<div class="inner">午後問題の歩き方 ｜ Java プログラミング問題の難易度（1）Java基本構文</div>
</div>
<p></a>
</div>
</div>
<p>&nbsp;</p><p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/gogo_arukikata/guide_caslii_2_of_questions_at_pm/">午後問題の歩き方 ｜ CASLⅡで必要となる2進数に関する知識</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></content:encoded>
			</item>
	</channel>
</rss>
