戦国IT - 情報処理技術者試験の過去問対策サイト
ブログお知らせお問い合わせ料金プラン

ITパスポート 2009年 秋期 60


問題文

“甘味”、 “うま味”、 “塩味”、 “酸味”、 “苦味”の5種類の味覚を、6ビット(2進数で6けた)の数値で符号化する。これらを組み合わせた複合味を、数値の加減算で表現できるようにしたい。例えば、“甘味”と“酸味”を組み合わせた“甘酸っぱい”という複合味の符号を、それぞれの数値を加算して表現するとともに、逆に“甘酸っぱい”から“甘味”成分を取り除いた“酸味”を減算で表現できるようにしたい。味覚の符号として、適切なものはどれか。
ITパスポート 2009年 秋期  問60の選択肢の画像

選択肢

(正解)

🔒 解説は解答すると表示されます

味覚の符号化(6ビットでの加減算)【ITパスポート 解説】

正解の理由

ウの割り当ては各味覚を異なるビット位置の「1」に対応させています。具体的には
  • 甘味 = (1)
  • うま味 = (2)
  • 塩味 = (4)
  • 酸味 = (8)
  • 苦味 = (16)
ここで「ビット(bit:binary digit、情報の最小単位)」を味ごとに1つ割り当てる(ワンホット/one-hot:一つだけ1が立つ表現)と、異なる味を組み合わせるときは単純にそれぞれの数値を加算すればよく、また元の成分を取り除くときは減算すれば残りの味が得られます。たとえば「甘酸っぱい」は )。そこから甘味(1)を引くと =酸味)となり、意図した通り取り出せます。
理由の要点:
  • 各味が2のべき乗(1,2,4,8,16)になっているので、和が一意に分解できる(重複がない)。
  • 桁あふれや同じ和になる衝突(あいまいさ)が起きない。

解法ステップ

  1. 要件を確認:複合味を「加算」で表現し、個成分を「減算」で取り出せるようにする。
  2. 衝突を避けるために、各成分を互いに重ならないビットに割り当てる(ワンホット方式)。
  3. 6ビットあるので最大で6種類の味まで個別ビットで表現可能。今回は5種類なので余裕あり。
  4. 各味を に割り当てればOK(例:甘味=、酸味= 等)。
  5. 加算・減算の例で動作確認(例を使って一意性を確かめる)。
計算例:
  • 甘味(1)+酸味(8)= → 二進数 (甘と酸のビットが立つ)
  • そこから甘味を減算: (酸味のみ)

選択肢別の誤答解説

  • ア:
    • 甘味が (0)になっており、ゼロは何の成分も表さないため「甘味」を足しても変わらず、引いても消えない。要件に合わない。
    • さらに他の割り当てに (3)などがあり、 のように他の組み合わせと等しくなりあいまいになる。
  • イ:
    • 値が連続(1,2,3,4,5)になっており、たとえば 3()は 1 と 2 の和と同じです。したがって「どの味の組み合わせか」を一意に決められない衝突が生じます。
  • エ:
    • ビットが下から順に連続して1になっている(例:3=, 7= ...)。これも部分和が他の味の値と一致してしまい、加算・減算で一意に分解できない。

よくある誤解

  1. 「ただ小さい数を順番に割り当てれば良い」と考える誤解
    • 小さい数を順に割ると、ある値が他の値の和と一致して混乱します(例:3=1+2)。必ず重複がない割り当て(ワンホット)を使うことが重要です。
  2. 「二進数で借り(borrow)が発生すると減算で取り出せない」と思う誤解
    • 借りが起きること自体は計算過程の話ですが、値が一意に割り当てられていれば数値としての減算結果は正しく残りの成分を表します。重要なのは各成分が互いに重ならないことです。
  3. 「ビット数が足りればどんな割り当ても大丈夫」と思う誤解
    • ビット数が多くても割り当て方次第で衝突は起きます。形(ワンホット)で割り当てることが肝心です。

補足コラム

  • ビットマスク(bitmask:ビットの集合を使ってON/OFFを表す方法)やワンホット(one-hot:一つだけ1が立つ表現)は、フラグ管理や権限管理などでもよく使われます。各フラグに2のべき乗を割り当てれば、複数フラグの組み合わせを1つの整数で表現でき、論理演算(AND/OR)や加減算で扱えます。
  • 6ビットなら表現できる組み合わせは (「何もない」も含む)です。今回の5味の組み合わせは十分に収まります。
補助コード例(動作確認、Python):
# 割り当て(ワンホット)
甘味 = 0b000001  # 1
酸味 = 0b001000  # 8

# 組み合わせ
甘酸っぱい = 甘味 + 酸味
print(bin(甘酸っぱい))  # 0b1001 -> 001001

# 減算で成分を取り出す
only_酸味 = 甘酸っぱい - 甘味
print(bin(only_酸味))    # 0b1000 -> 001000

FAQ

Q1: 「加算」でなく「ビットごとの OR 演算(論理和、英: OR)」を使った方が良いですか?
A1: 実務的には同じ状況ではどちらでも使えます。ワンホットにしておけば、数値の加算はビットごとの OR と等価になります。ビット演算の方が意図が明確なのでコードでは OR(|)を使うことが多いです。
Q2: 減算で取り除くときに間違えやすい点は?
A2: 減算で取り除く場合は取り除く成分が実際に含まれていることを前提とします。含まれていない成分を引くと負の値になるか、別の意味のビット構成になってしまうので注意が必要です。安全にはビットマスクで AND と NOT を使って消す方法(combined & ~component)を使います。
Q3: 6ビットで6種類以上の味を扱う必要が出たら?
A3: 6ビットなら最大6つまでワンホットで割り当て可能です。7つ以上ならビット数を増やす(例えば8ビット)か、別の符号化(多値符号や複合ビット割当)を検討しますが、要件(加減算で扱う)によってはワンホットを拡張するのが最も単純で確実です。

関連キーワード: ビット、バイナリ(二進数)、ワンホット(one-hot:一つだけ1が立つ表現)、ビットマスク(bitmask)、加算、減算、ビット演算、組み合わせ表現、フラグ管理
← 前の問題へこの年度をクイズで解く次の問題へ →
戦国ITクイズ機能

\ せっかくなら /

ITパスポート
クイズ形式で学習しませんか?

クイズ画面へ遷移する

すぐに利用可能!

©︎2026 情報処理技術者試験対策アプリ

このサイトについてブログプライバシーポリシー利用規約特商法表記開発者について