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

選択肢
ア:3847番地
イ:7680番地
ウ:7694番地(正解)
エ:8978番地
🔒 解説は解答すると表示されます
画素座標からのアドレス計算【午前2解説】
正解の理由
始点・終点の表記 (54)、(98) はそれぞれ (5,4)、(9,8) の座標を表すと解釈します。これらを結ぶ直線の傾きは (8−4)/(9−5)=1 で、直線上の点は y = x − 1 を満たします。したがって x=7 のとき y = 6 となる画素は座標 (7,6) です。メモリ割り当ては行優先(x が最も速く変化)で、1画素は16ビット=2バイトなので、先頭バイトアドレスは次の式で求まります。
これに (x,y)=(7,6) を代入すると
よって選択肢のうち ウ(7694番地)が正しいです。
解法ステップ
- (54)、(98) をそれぞれ (5,4)、(9,8) と読む根拠を確認する(座標表記がその形式であること)。
- 直線の傾きを計算する:傾き = (y2 − y1)/(x2 − x1) = (8−4)/(9−5) = 1。
- 直線の式を決める:y − 4 = 1×(x − 5) → y = x − 1。
- 指定の x=7 を代入して y を求める:y = 7 − 1 = 6。対象画素は (7,6)。
- 1画素=2バイト、行幅=640ピクセルなのでバイト先頭アドレスを計算: 。
選択肢別の誤答解説
-
ア: 3847番地
これは (6×640+7)=3847 を計算した値で、画素の「インデックス(画素番号)」を求めたが、1画素が2バイトである点を忘れてバイトアドレスに換算していない誤りです。 -
イ: 7680番地
これは 2×(6×640)=2×3840=7680 を計算した値です。y は正しく6としたが、x のオフセット(+7)を加えるのを忘れてしまったミスです。 -
ウ: 7694番地(正解)
上記の正しい手順で得られるバイト先頭アドレスです。 -
エ: 8978番地
これは y を7、x を9など誤った座標に基づく計算や、直線の式を y=x と誤認して端点 (9,8) の x を用いるなどの誤りで生じる値です(例:2×(7×640+9)=8978)。始点・終点の読み替えや直線の式の誤解が原因になります。
よくある誤解
- (54) や (98) を「単一の数値(54、98)」やメモリアドレスと誤解する。図中の丸の表記は座標 (5,4) や (9,8) のように桁ごとに x,y を表していると読むのが自然です。
- アドレス計算で「画素番号」と「バイトアドレス」を混同する。画素番号 = y×幅 + x、バイトアドレス = 画素番号×(バイト/画素) です。
- 直線の式の導出で x と y のどちらを独立変数にするか迷い、誤った y を使う。
補足コラム
汎用的なフレームバッファのバイトオフセットは次の式で表せます。
ここで B は1画素あたりのバイト数(今回 B=2)、W は画面幅(今回 W=640)です。行優先(row-major)の配置はグラフィックモジュールで最も一般的であり、x の増加がメモリ上で連続することを覚えておくと良いです。エンディアン(バイト順)は画素の先頭アドレスには影響しませんが、同じ画素の高位・低位バイトの意味は変わります(色表現の読み書き時に注意)。
簡単な確認用 Python(例):
W = 640
B = 2
x, y = 7, 6
address = B * (y * W + x)
print(address) # 7694
FAQ
Q. なぜ (54) を (5,4) と読むのですか?
A. 問題図が格子上の座標を示しており、カッコ内の2桁は x と y のそれぞれの座標値を表す表記と解釈するのが自然です(図の黒丸が格子点を示していることから)。この読み方を前提に直線の傾きや位置を求めます。
A. 問題図が格子上の座標を示しており、カッコ内の2桁は x と y のそれぞれの座標値を表す表記と解釈するのが自然です(図の黒丸が格子点を示していることから)。この読み方を前提に直線の傾きや位置を求めます。
Q. 1画素16ビットなら「番地」はどの単位ですか?
A. 図のメモリ表記がバイト単位(0番地、1番地、…)で、かつ「8 bit」と記されているため、番地はバイト単位です。したがって画素先頭の番地はバイトオフセットで表します。
A. 図のメモリ表記がバイト単位(0番地、1番地、…)で、かつ「8 bit」と記されているため、番地はバイト単位です。したがって画素先頭の番地はバイトオフセットで表します。
Q. もし画素配置が列優先(縦優先)ならどうなる?
A. その場合は逆に x と y の役割が入れ替わり、算式は のようになります。問題文の「x=0からx軸方向に割り当てていく」「x=639の次はx=0でyを1増やす」から行優先であることが明示されています。
A. その場合は逆に x と y の役割が入れ替わり、算式は のようになります。問題文の「x=0からx軸方向に割り当てていく」「x=639の次はx=0でyを1増やす」から行優先であることが明示されています。
関連キーワード: 2D→1D変換、フレームバッファ、行優先配置、バイトオフセット、ピクセルアドレス計算

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

