基本情報のビット演算とマスクの解き方を例題で解説
公開 更新

気になるところから読んで大丈夫。ひとつずつ、いっしょに理解していこうにゃ。
この記事の目次
基本情報技術者試験のビット演算では、ビット列の必要な部分だけを残したり、特定の桁を1にしたり、反転したりする問題があります。解くときは、まず操作の目的を決め、次にAND・OR・XORとマスクの組み合わせを選びます。
残したい桁を1にしたマスクとのANDは抽出に、1にしたい桁を1にしたマスクとのORは設定に、反転したい桁を1にしたマスクとのXORは反転に使えます。桁ごとに0と1の組み合わせを確かめれば、暗記だけに頼らず判断できます。
- マスクは操作する桁を選ぶためのビット列
- ANDではマスクが0の桁を消し、1の桁を残す
- ORでは1を立て、XORでは1の位置を反転する
- 16進数は4桁ずつ2進数に直してから比べる
基本情報のビット演算とマスクとは

ビット演算は、2進数の各桁を対応させて行う操作です。ビットは0または1を表します。たとえば8ビットの値なら、左から右まで8つの位置にそれぞれ0か1が入ります。2つの値を演算するときは、右端同士、右から2桁目同士というように、同じ位置を比べます。
マスクは、どの位置を残すか、変えるかを指定するために用意するビット列です。元の値にもう一つのビット列を重ね合わせ、各位置で論理演算を行います。マスク自体に「1なら残す」という共通の意味があるわけではありません。AND、OR、XORのどれを使うかで働きが変わります。
たとえば元の値が10110101、マスクが00001111なら、左から4桁と右から4桁を分けて扱えます。ただし同じ00001111でも、ANDなら上位を0にし、ORなら下位を1にし、XORなら下位を反転します。演算名を見ずにマスクだけで答えを決めないことが大切です。
ANDやORの基本的な組み合わせは、論理演算と真理値表の解き方でも確認できます。この記事では、その基礎を使って、複数の桁を目的どおりに操作する手順を見ていきます。
ANDで必要なビットを取り出す

ANDは、対応する2つのビットがともに1の場合だけ結果が1になります。元のビットが0でも1でも、マスクが0なら結果は0です。マスクが1なら、元が0の場合は0、元が1の場合は1なので、その桁の値がそのまま残ります。
したがって「残したい桁を1、0にしたい桁を0」にしたマスクを作り、元の値とのANDを取ります。例えば10110101から下位4ビットだけを取り出すときのマスクは00001111です。
元の値 10110101
マスク 00001111
AND結果 00000101
上位4桁はすべて0になり、下位の0101が残りました。「取り出す」は不要な桁を0にするという意味であり、残った桁が自動的に右へ移動するわけではありません。途中の桁を右端にそろえる必要があれば、問題の条件に従って別途シフトを考えます。
別の例として、最上位の1桁を除いて下位7ビットを残すなら01111111とのANDを使います。元の値が10110101なら結果は00110101です。マスクが16進数で示される場合、0111は7、1111はFなので、01111111は7Fと表せます。
ORとXORで指定した桁を変える

ORは指定した桁を1にする
ORは、対応する2つのビットの少なくとも一方が1なら結果が1です。マスクが1の位置は元の値に関係なく1になり、マスクが0の位置は元の値が変わりません。特定の位置に1を立てたいときは、その位置を1にしたマスクとのORを使います。
元の値 10100100
マスク 00001100
OR結果 10101100
マスクが1の2つの位置が1になります。もともと1だった位置も1のままです。このため、ORは「指定位置を1にする」操作であって、「指定位置を必ず反転する」操作ではありません。
XORは指定した桁を反転する
XORは、対応する2つのビットが異なる場合に1、同じ場合に0になります。マスクが0なら元の値を保ち、マスクが1なら0を1に、1を0にします。変えたい位置だけを1にしたマスクとのXORで、そこだけを反転できます。
元の値 10100100
マスク 00001100
XOR結果 10101000
ORと結果を比べると、もともと1だった位置がXORでは0になっています。全ビットを反転させたいときは、対象の幅すべてを1にしたマスクを使います。8ビットなら11111111です。幅が問題文に指定されているかも必ず確認しましょう。
なお、特定の1ビットが立っているかを調べる場合もANDが使えます。調べたい位置だけを1にしたマスクと元の値のANDを取り、結果が0ならその位置は0、0でなければ1です。結果は必ず数値の1になるわけではなく、対象位置の重みを保ったビット列になります。
16進数の選択肢を比べる手順

選択肢が16進数のときは、各桁を4ビットに変換してから対象の位置と照らし合わせます。たとえば0Fは00001111、7Fは01111111、FFは11111111です。先頭の0を省くとビットの位置を間違えやすいため、8ビットの問題では8桁をそろえて書きます。
- 何ビットの値を操作するかを確認する。
- 残す、0にする、1にする、反転する位置を問題文から決める。
- 選択肢のマスクを同じ桁数の2進数に直す。
- 演算ごとに、マスクの0と1が元の桁へどう作用するか確かめる。
- 必要なら元の桁が0の場合と1の場合の両方で試す。
最後の確認は、具体例が一つ合うだけでは十分でないためです。元の桁がもともと0なら、ANDでその桁を消しても「値が保たれた」ように見えることがあります。元が1の場合も試すと、その操作が常に求める条件を満たすか判断できます。
数の変換に自信がない場合は、2進数と16進数の変換を先に復習しましょう。16進数の1桁が2進数の4桁に対応することを押さえると、長いマスクも分割して読めます。
例題でマスクの作り方を確認する

8ビットの値から、右端を第1ビットとして第3〜第5ビットをそのまま残し、それ以外を0にする例を考えます。まず右から3桁目、4桁目、5桁目だけを1にし、ほかを0にすると、マスクは00011100です。桁を残してほかを0にしたいのでANDを選びます。
元の値 10110110
マスク 00011100
AND結果 00010100
元の第3〜第5ビットは右から順に1、0、1です。結果にも同じ位置に1、0、1が残り、それ以外は0になります。マスクは16進数なら1Cです。左から数える指定なのか、右端を何番目とするのかによってマスクの位置は変わるため、問題文の数え方を優先してください。
次に「同じ3つの位置を1にする」なら00011100とのOR、「同じ位置を反転する」なら00011100とのXORです。同じマスクでも操作の目的に応じて演算を変えます。どの演算でも同じ結果になると考えず、少なくとも1桁ずつ照合しましょう。
IPAが公開する科目Bサンプル問題には、ビット単位の論理積・論理和とシフトを使う例があります。問題中で定義された記号とビット幅を確かめ、処理を一行ずつ追う練習に活用できます。実際の試験内容や適用される範囲は、受験時点のIPAの案内で確認してください。
基本情報のビット演算で間違えやすい点

よくある間違いは、「マスクの1は常に残す桁」と覚えてしまうことです。ANDでは1の位置が残りますが、ORでは1に設定され、XORでは反転します。まず演算を特定し、その後にマスクを見る順番にすると混同を減らせます。
もう一つは、下位桁を取り出すことと桁を移動することを混同することです。ANDによる抽出だけでは、選んだビットの位置は変わりません。右に移して数値として読みたい場合には、必要なシフト数と空いた桁の扱いも問題文から確認します。シフト自体はシフト演算の基本で別に練習できます。
復習では、元の値を変えても成立するかを確かめてください。最初は元の値とマスクを縦に並べ、各列の結果を一つずつ書きます。慣れてきたら、ANDは0で消す、ORは1で立てる、XORは1で反転すると考え、最後に代表的な桁を検算します。
練習の仕上げには、同じ元の値とマスクでAND・OR・XORをそれぞれ計算し、どの桁が変わったか説明してみましょう。正解を暗記するだけでなく、マスクが0と1のときの動きを言葉にできれば、選択肢の並びが変わっても比較できます。
試験では「残す」「1にする」「反転する」という指示を見分けることが出発点です。必要なビット幅をそろえ、操作目的に合う演算を選び、0と1の両方で確かめる。この順番を繰り返せば、初めて見るマスクでも手順に沿って解けます。
