新らしくなった基本情報 科目 B 20問バージョン アルゴリズムとプログラミング サンプル問題16をJavaにしてみました

2023 年 4 月からIPA (独立行政法人情報処理推進機構)の基本情報技術者試験の制度が変更されました。

ここでは、「基本情報技術者試験 科目 B のサンプル問題20問バージョン」の中から、アルゴリズムとプログラミングの問題を取り上げ、Javaのソースコードを示します。

新人エンジニア研修に参加されている皆様の参考になれば幸いです。

問 16

基本情報技術者試験 科目 B のサンプル問題  問16

【Javaプログラム】

public class Q16 {
    // 本問で問われているUnicodeコードポイントをUTF-8符号に変換するメソッド
    private static int[] encode(int codePoint) {
        //配列の先頭にダミーの0を入れているのはJavaの添字が0始まりだから。
        int[] utf8Bytes = { 0, 224, 128, 128 };
        int cp = codePoint;
        int i;

        for (i = utf8Bytes.length - 1; i >= 1; i--) {
            utf8Bytes[i] = utf8Bytes[i] + (cp % 64);
            //utf8Bytes[i] = utf8Bytes[i] | (cp % 64); //この部分はビット列を合成しているのでOR演算(|)でも結果は同じになります。
            cp = cp / 64;
        }
        return utf8Bytes;
    }

    public static void main(String[] args) {
        int codePoint = 0x3042; // ひらがな'あ'のUnicodeコードポイント
        int[] utf8Bytes = encode(codePoint); // UTF-8符号へ変換

        // 変換結果を出力
        System.out.print("ひらがな'あ'のUTF-8符号: ");
        for (int i = 1; i < utf8Bytes.length; i++) {
            System.out.printf("%8s", Integer.toBinaryString(utf8Bytes[i])); // 2進数表記で出力
            if (i < utf8Bytes.length - 1) {
                System.out.print(" ");
            }
        }
    }
}

【結果】

ひらがな'あ'のUTF-8符号: 11100011 10000001 10000010

【プログラムの解説】

このプログラムは、UnicodeコードポイントをUTF-8符号に変換する encode() メソッドを定義し、それを呼び出して、ひらがなの文字 "あ" のUTF-8符号を表示するものです。

encode() メソッドは、Unicodeコードポイントを受け取り、UTF-8符号のバイト列を配列で返します。具体的には、以下の手順でバイト列を生成しています。

  1. バイト列を表す配列 utf8Bytes を初期化します。配列の先頭にはダミーの0が入っています。
  2. Unicodeコードポイントを cp 変数に代入します。
  3. バイト列の最後から順番に、cp を64で割った余りを各バイトに加算します。UTF-8符号では、2バイト目以降のバイトには先頭に 10 のビットをつける必要があるため、64で割った余りを加算することで、先頭2ビットを 10 に設定しています。また、加算した後に cp を64で割ることで、次のバイトに必要な値を求めるために必要な操作を行っています。

main() メソッドでは、ひらがなの文字 "あ" のUnicodeコードポイント 0x3042encode() メソッドに渡し、UTF-8符号のバイト列を取得します。そして、Integer.toBinaryString() メソッドを使って、各バイトの2進数表記を出力しています。

このプログラムは、UnicodeとUTF-8符号の相互変換方法を理解する手助けになるでしょう。また、ビット演算を用いたバイト列の生成方法についても学ぶことができます。