サンプル問題 [科目B]問16

午前試験免除制度対応!基本情報技術者試験のeラーニング【独習ゼミ】
 次のプログラム中の に入れる正しい答えを,解答群の中から選べ。二つの には,同じ答えが入る。ここで,配列の要素番号は1から始まる。

 Unicodeの符号位置を,UTF-8の符号に変換するプログラムである。本問で数値の後ろに"(16)"と記載した場合は,その数値が16進数であることを表す。
 Unicodeの各文字には,符号位置と呼ばれる整数値が与えられている。UTF-8は,Unicodeの文字を符号化する方式の一つであり,符号位置が 800(16) 以上 FFFF(16) 以下の文字は,次のように3バイトの値に符号化する。
 3バイトの長さのビットパターンを 1110xxxx 10xxxxxx 10xxxxxx とする。ビットパターンの下線の付いた"x"の箇所に,符号位置を2進数で表した値を右詰めで格納し,余った"x"の箇所に,0を格納する。この3バイトの値がUTF-8の符号である。
 例えば,ひらがなの" あ" の符号位置である 3042(16) を2進数で表すと 11000001000010 である。これを,上に示したビットパターンの"x"の箇所に右詰めで格納すると,1110xx11 10000001 10000010 となる。余った二つの"x"の箇所に0を格納すると,"あ"のUTF-8の符号 11100011 10000001 10000010 が得られる。
 関数 encode は,引数で渡されたUnicodeの符号位置をUTF-8の符号に変換し,先頭から順に1バイトずつ要素に格納した整数型の配列を返す。encode には,引数として,800(16) 以上 FFFF(16) 以下の整数値だけが渡されるものとする。

〔プログラム〕
b16_1.png

  • ((4-i) × 2)
  • (2 の (4-i)乗)
  • (2 の i乗)
  • (i × 2)
  • 2
  • 6
  • 16
  • 64
  • 256
正解 問題へ
分野:アルゴリズムとプログラミング
カテゴリ:データ構造及びアルゴリズム
解説
符号位置は800(16)以上FFFF(16)とあります。
  • 800(16) = 1000 0000 0000(2)
  • FFFF(16) = 1111 1111 1111 1111(2)
ですから、引数 codePoint のビット長は12ビット以上16ビット以下ということになります。また、変数 utf8Bytes の値はそれぞれ
  • utf8Bytes[1] = 224(10) = 11100000(2)
  • utf8Bytes[2] = 128(10) = 10000000(2)
  • utf8Bytes[3] = 128(10) = 10000000(2)
となっていて、下線の部分に codePoint から切り出したビット列をコピーすることになります。

for文ではループ変数 i をデクリメント(-1)しながら3回繰返しますが、各回で行うべき処理は以下のとおりです。
  1. 1回目 … utf8Bytes[3] に codePoint の下位6ビットをコピー
  2. 2回目 … utf8Bytes[2] に codePoint の下位7ビット目から12ビット目までの6ビットをコピー
  3. 3回目 … utf8Bytes[1] に codePoint の残りの部分をコピー
変数 cp から下位6ビットを取得する方法についてですが、10進数の整数で下位3桁を取得したいときに「103=1,000」で割った余りを求めるのと同じで、2進数で下位3桁を取得するときには「23=8」で割ることになります。今回は下位6ビットを取得したいので「26=64」を使うのが適切です。したがって「ク」が正解です。

Pagetop