サンプル問題 [科目B]問16
問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) 以下の整数値だけが渡されるものとする。
〔プログラム〕
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) 以下の整数値だけが渡されるものとする。
〔プログラム〕
- ((4-i) × 2)
- (2 の (4-i)乗)
- (2 の i乗)
- (i × 2)
- 2
- 6
- 16
- 64
- 256
分類
アルゴリズムとプログラミング » データ構造及びアルゴリズム
正解
ク
解説
符号位置は800(16)以上FFFF(16)とあります。
for文ではループ変数 i をデクリメント(-1)しながら3回繰返しますが、各回で行うべき処理は以下のとおりです。
- 800(16) = 1000 0000 0000(2)
- FFFF(16) = 1111 1111 1111 1111(2)
- utf8Bytes[1] = 224(10) = 11100000(2)
- utf8Bytes[2] = 128(10) = 10000000(2)
- utf8Bytes[3] = 128(10) = 10000000(2)
for文ではループ変数 i をデクリメント(-1)しながら3回繰返しますが、各回で行うべき処理は以下のとおりです。
- 1回目 … utf8Bytes[3] に codePoint の下位6ビットをコピー
- 2回目 … utf8Bytes[2] に codePoint の下位7ビット目から12ビット目までの6ビットをコピー
- 3回目 … utf8Bytes[1] に codePoint の残りの部分をコピー