応用情報技術者 2019年 春期 午前2 問01
問題文
0以上255以下の整数に対して、
と定義する。と等しい式はどれか。ここで、 AND 及び OR は、それぞれとを2進数表現にして、桁ごとの論理積及び論理和をとったものとする。
選択肢
ア:(n+1) AND 255(正解)
イ:(n+1) AND 256
ウ:(n+1) OR 255
エ:(n+1) OR 256
🔒 解説は解答すると表示されます
8ビット循環インクリメント【午前2解説】
正解の理由
next(n) は 0〜255 の範囲で「1増やすが255の次は0に戻る」動作をする、すなわち 256 で剰余を取る加算()です。ビット演算でこれを実現するには下位8ビットだけを残すマスクが必要であり、255(2進で11111111)とのビットANDが対応します。したがって選択肢アの は各ケースで next(n) と一致します。
例: のとき だが となり、定義どおり 0 に戻ります。一般に
が成り立ちます。
解法ステップ
- next(n) の動作を「 をとって 0〜255 に収める(剰余 256)」と理解する。すなわち 。
- ビット演算の性質から、下位8ビットだけを取り出すにはマスク 255()との AND を用いると考える。
- 各選択肢をビット操作として評価し、 の下位8ビットを残すものが一致するか確認する。
選択肢別の誤答解説
-
ア: (n+1) AND 255
正しい。255 は2進で 11111111(下位8ビットが1)なので、下位8ビットだけを残す。 のとき が 256 & 255 = 0 となり定義と一致する。 -
イ: (n+1) AND 256
誤り。256 は2進で 1 0000 0000(9ビット目のみ1)であり、これは「9ビット目だけを抽出する」操作になる。すなわち は通常 0 を返すが、 のときだけ 256 を返す(0 または 256 のどちらか)。したがって next(n)(常に 0〜255)とは一致しない。過去の誤記述「常に0になる」は誤りで、正しくは「0 または 256 を返すため範囲が 0〜255 に限定されない」と説明すべきです。 -
ウ: (n+1) OR 255
誤り。OR 255 は下位8ビットを全て1にするため、ほとんどの場合 255 を返す。例えば のとき でも となり、next(0)=1 と一致しない。 -
エ: (n+1) OR 256
誤り。OR 256 は常に9ビット目を1にするため、 の値が小さくても結果は になり、next(n) の取りうる範囲(0〜255)と異なる。例えば なら で不適。
よくある誤解
- 「AND 256 は常に0になる」と考える誤り:実際には 9ビット目(重み256)を抽出する操作で、 のときだけ 256 を返します。したがって値域は 0 または 256 になります。
- OR と AND を混同する:OR はビットを1に固定するため値が大きくなりがちで、循環(モジュロ)動作には向きません。循環は下位ビットを取り出す AND(マスク)が基本です。
- マスク値の選び方の誤り:(例:255)は「下位 k ビットを残す」マスクで、剰余 と同値になる点を覚えておくと良いです。
補足コラム
ビットマスクによる剰余操作は高速な循環カウンタやリングバッファの実装でよく使われます。一般に
が成り立つため、 のときは 255 がマスクになります。CPU では除算よりビット演算の方が高速なケースがあり、2の冪に対する剰余は特に頻出です。
簡単な実装例(Python):
def next_n(n):
# n は 0 <= n <= 255 を仮定
return (n + 1) & 0xFF # 0xFF は 255
FAQ
Q: なぜ 255 を使うと「剰余 256」になるのですか?
A: 255 は2進で下位8ビットが全て1なので、AND することで下位8ビットだけを残します。これが と同値です。
A: 255 は2進で下位8ビットが全て1なので、AND することで下位8ビットだけを残します。これが と同値です。
Q: 負の値や範囲外の入力でも同様ですか?
A: 上の等式はビット表現と幅(符号なし)に依存します。問題は と定義されているため上記で正確に動作します。符号付き表現などでは別途注意が必要です。
A: 上の等式はビット表現と幅(符号なし)に依存します。問題は と定義されているため上記で正確に動作します。符号付き表現などでは別途注意が必要です。
Q: OR で代用できないのはなぜですか?
A: OR はビットを1にする操作で、値を「上げる」方向に作用します。循環させるためには下位ビットを取り出す AND(マスク)が適切です。
A: OR はビットを1にする操作で、値を「上げる」方向に作用します。循環させるためには下位ビットを取り出す AND(マスク)が適切です。
関連キーワード: ビット演算, マスク, 循環インクリメント, モジュロ256, 下位ビット抽出

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

