応用情報技術者 2022年 春期 午前2 問21
問題文
次の方式で画素にメモリを割り当てる 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増やす。

選択肢
ア:3847
イ:7680
ウ:7694(正解)
エ:8978
🔒 解説は解答すると表示されます
画素先頭バイト算出【午前2解説】
正解の理由
メモリはバイト単位で番地付けされ、1画素は16ビット(2バイト)で連続割り当てされています。よって、画素座標 (x,y) の先頭バイト番地は
で表されます。設問で求めるのは「直線上の x=7 の画素の先頭バイト番地」です。選択肢をそれぞれ「画素先頭としてあり得るか(=偶数か)」「そのときの画素座標の x が 7 になるか」で調べると、唯一条件を満たすのが ウ(7694)だからです。以下に計算過程を示します。
解法ステップ
- 前提の整理
- メモリはバイト番地(0,1,2,…)。
- 1画素 = 2バイト。
- 画素インデックス(行優先)を p = y×640 + x とすると、先頭バイト番地は addr = 2p。
- 選択肢を「先頭バイト番地候補」として検査
- 先頭バイト番地は必ず偶数(2×整数)であるため奇数の候補は除外。
- 各偶数候補について p = addr / 2 を求め、x = p mod 640, y = ⌊p / 640⌋ を計算。
- 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 バイトになります。
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)でした。
A. (7,7) の場合は addr = 2×(7×640+7) = 2×4487 = 8974 です。ただし設問では直線の指定や与えられた選択肢の中から x=7 を満たす候補を検証した結果、与えられた選択肢で正しいのは ウ(7694)でした。
関連キーワード: 画像メモリ、バイトオフセット、画素座標、行優先割当、アドレス変換

\ せっかくなら /
応用情報技術者を
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

