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

応用情報技術者 2022年 春期 午前221


問題文

次の方式で画素にメモリを割り当てる 640×480のグラフィック LCD モジュールがある。始点 (54) から終点 (98) まで直線を描画するとき、直線上の x=7の画素に割り当てられたメモリのアドレスの先頭は何番地か。ここで、画素の座標は (x, y)で表すものとする。   〔方式〕  ・メモリは0番地から昇順に使用する。  ・1画素は16ビットとする。  ・座標(0, 0)から座標(639,479)までメモリを連続して割り当てる。  ・各画素は、x=0からx軸の方向にメモリを割り当てていく。  ・x=639の次はx=0とし、yを1増やす。
応用情報技術者 2022年 春期 午前2 問21の問題画像

選択肢

3847
7680
7694(正解)
8978

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

画素先頭バイト算出【午前2解説】

正解の理由

メモリはバイト単位で番地付けされ、1画素は16ビット(2バイト)で連続割り当てされています。よって、画素座標 (x,y) の先頭バイト番地は で表されます。設問で求めるのは「直線上の x=7 の画素の先頭バイト番地」です。選択肢をそれぞれ「画素先頭としてあり得るか(=偶数か)」「そのときの画素座標の x が 7 になるか」で調べると、唯一条件を満たすのが (7694)だからです。以下に計算過程を示します。

解法ステップ

  1. 前提の整理
    • メモリはバイト番地(0,1,2,…)。
    • 1画素 = 2バイト。
    • 画素インデックス(行優先)を p = y×640 + x とすると、先頭バイト番地は addr = 2p。
  2. 選択肢を「先頭バイト番地候補」として検査
    • 先頭バイト番地は必ず偶数(2×整数)であるため奇数の候補は除外。
    • 各偶数候補について p = addr / 2 を求め、x = p mod 640, y = ⌊p / 640⌋ を計算。
  3. x = 7 になる候補を採用する(問題は「x=7 の画素」を指定しているため)。
実際の計算:
  • ア: 3847 → 奇数 → 画素先頭になり得ない(除外)。
  • イ: 7680 → p = 7680/2 = 3840 → x = 3840 mod 640 = 0(x≠7)。
  • : 7694 → p = 7694/2 = 3847 → x = 3847 mod 640 = 7, y = ⌊3847/640⌋ = 6 → x=7(条件一致)。
  • エ: 8978 → p = 8978/2 = 4489 → x = 4489 mod 640 = 9(x≠7)。
したがって、条件を満たすのは の 7694 のみです。

選択肢別の誤答解説

  • ア: 3847
    奇数のため「画素の先頭バイト番地」になり得ません。先頭バイトは必ず偶数です(2倍の形)。
  • イ: 7680
    偶数で先頭バイト候補にはなるが、p=3840 に対応する画素座標は (x,y)=(0,6) であり、x=7 ではありません。
  • : 7694
    p=3847 に対応する画素座標は (7,6)。先頭バイトかつ x=7 を満たします。したがって正解。
  • エ: 8978
    p=4489 に対応する画素座標は (9,7) であり、x=7 ではありません。

よくある誤解

  • メモリ番地と画素座標を混同する
    「(54) や (98)」のような表記をそのまま座標 (x,y) と誤解しないこと。番地(バイト単位)→画素座標へは p=⌊addr/2⌋ を経て変換する必要があります。
  • 1画素を1バイトと誤認する
    問題で「1画素は16ビット」と明示されている場合は必ず 2 バイトで扱うこと。これを忘れると行幅(バイト数/行)が 640 と 1280 で異なり誤答になります。
  • 先頭バイトでない番地をそのまま使う
    先頭バイトは常に偶数。奇数を先頭番地と見なすミスに注意。

補足コラム

逆算で判断する手法は試験でも有効です。求められた x(または y)の条件がある場合、すべての選択肢を「先頭バイトか」「対応する画素の x(または y)が条件を満たすか」で検証すると早く確実に絞れます。
簡単な確認用 Python(参考)
def addr_to_xy(addr):
    if addr % 2 == 1:
        return None  # 先頭バイトでない
    p = addr // 2
    x = p % 640
    y = p // 640
    return x, y

for a in [3847, 7680, 7694, 8978]:
    print(a, addr_to_xy(a))

FAQ

Q. なぜ先に「addr = 2×(y×640 + x)」と明示する必要があるのか?
A. メモリはバイト単位で番地がふられており、1画素が2バイトなら画素インデックス p を 2 倍しないとバイト番地にならないためです。行ごとのバイト幅は 640×2 = 1280 バイトになります。
Q. (7,7) に割り当てられる先頭バイトは?
A. (7,7) の場合は addr = 2×(7×640+7) = 2×4487 = 8974 です。ただし設問では直線の指定や与えられた選択肢の中から x=7 を満たす候補を検証した結果、与えられた選択肢で正しいのは (7694)でした。

関連キーワード: 画像メモリ、バイトオフセット、画素座標、行優先割当、アドレス変換
← 前の問題へこの年度をクイズで解く次の問題へ →
戦国ITクイズ機能

\ せっかくなら /

応用情報技術者
クイズ形式で学習しませんか?

クイズ画面へ遷移する

すぐに利用可能!

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

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