科目B

基本情報技術者試験 科目B サンプル問題セット(2022年12月公表) 問16

次のプログラム中の に入れる正しい答えを,解答群の中から選べ。二つの には,同じ答えが入る。ここで,配列の要素番号は 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) 以下の整数値だけが渡されるものとする。 〔プログラム〕
○整数型の配列: encode(整数型: codePoint)
  /* utf8Bytesの初期値は,ビットパターンの“x”を全て0に置き換え,
     8桁ごとに区切って,それぞれを2進数とみなしたときの値 */
  整数型の配列: utf8Bytes ← {224, 128, 128}
  整数型: cp ← codePoint
  整数型: i
  for (i を utf8Bytesの要素数 から 1 まで 1 ずつ減らす)
    utf8Bytes[i] ← utf8Bytes[i] + (cp ÷   の余り)
    cp ← cp ÷   の商
  endfor
  return utf8Bytes
答えを選ぶ

出典:基本情報技術者試験 科目B サンプル問題セット(2022年12月公表) 問16(問題文は IPA の公開問題。図・数式・下線などはテキストに直して掲載。解説は当サイト作成)

科目Bの解き方と全問の一覧

解説に誤りを見つけたら、解説の誤りを報告してください。

答えと解説を見る

正解:ク

覚える知識

UTF-8の符号化(6ビットずつ下位から格納)

2 の k 乗で割った余りが下位 k ビット、商が右へ k ビットシフトした値になる。UTF-8 の 3 バイト形式では、下位から 6・6・4 ビットずつ格納する。

この問題で必要なこと

2・3 バイト目の x は 6 ビットなので、下位 6 ビットは cp ÷ 64 の余り、残りは商で求まる。i=3,2 で 6 ビットずつ取り、最後の i=1 で残り 4 ビットが 1 バイト目に入る(cp ≤ FFFF なので 16 未満)。正解はク(64)。

ひっかけ

1 バイト全体の 256(ケ)や 16 進の 1 桁 16(キ)と取り違えたり、6(カ)をビット数のまま割る数にしたりする誤りを誘う。