この概念が出た関連問題

この試験の対策ガイド

情報処理安全確保支援士試験 対策ガイド

合格率・勉強法・参考書の選び方をまとめています

見る →
答えと解説を見る(先に解くのがおすすめ)

正解は ア

解説

0以上255以下の整数nに対し、next(n)は0〜254では n+1、255では0を返す関数です。これは8ビット符号なし整数のインクリメントが255の次に0へ折り返す(mod 256で1を足す)挙動そのものです。各選択肢を検証します。nが0〜254のときn+1は1〜255で、255は2進数で11111111(8桁すべて1)なので、(n+1) AND 255 はn+1の下位8ビットをそのまま残し、n+1(=1〜255)に一致します。n=255のときn+1=256=100000000(9桁目が1)で、256 AND 255 は下位8ビットがすべて0なので0となり、定義どおり0が得られます。したがって(n+1) AND 255 が全範囲でnext(n)に一致し、選択肢aが正解です。ANDによる「255でのマスク」は、値を8ビットの範囲に丸める常套手段として頻出します。一般化すると「2のk乗で割った剰余=(2のk乗−1)とのAND」という関係が成り立ち、ビット演算で剰余を高速に求める基本テクニックとして覚えておくと有用です。

なぜ他の選択肢は違うのか

選択肢 イ
(n+1) AND 256 は誤りです。256は2進数で100000000(9桁目だけが1)であり、n+1が1〜256のときその9桁目が1になるのはn+1=256(n=255)のときだけです。よってn=0〜254ではAND結果が0となり、本来n+1を返すべき定義と一致しません。マスクに使う値の桁の位置を取り違えており、8ビットに丸めるなら255でなければなりません。
選択肢 ウ
(n+1) OR 255 は誤りです。255は下位8ビットがすべて1なので、どんな値とORしても下位8ビットは必ずすべて1になり、結果は最低でも255以上の値になります。n=0でも255を返してしまい、本来のnext(0)=1とは一致しません。ORは「指定ビットを強制的に立てる」演算であり、値を一定範囲に丸める用途にはそもそも使えない点が誤りの本質です。
選択肢 エ
(n+1) OR 256 は誤りです。256とのORは9桁目(256の位)を必ず1にするため、結果は常に256以上になります。n=0ではnext(0)=1を返すべきところ257(=256+1)となり一致しません。256での折り返し(mod 256)を表現したいならANDによるマスクを使うべきで、ビットを立てるORでは折り返しを表現できないため不適切です。

解くときのポイント

「値を8ビット(0〜255)の範囲に丸める=255とのAND」「mod 2のk乗=(2のk乗−1)とのAND」がビット演算の定番。ORはビットを立てる演算なので範囲制限には使えない。255=11111111、256=100000000の対比を押さえる。