科目別解説

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

方眼ノートとパソコンでビット演算を学ぶ机

気になるところから読んで大丈夫。ひとつずつ、いっしょに理解していこうにゃ。

この記事の目次
  1. 基本情報のビット演算とマスクとは
  2. ANDで必要なビットを取り出す
  3. ORとXORで指定した桁を変える
  4. 16進数の選択肢を比べる手順
  5. 例題でマスクの作り方を確認する
  6. 基本情報のビット演算で間違えやすい点

基本情報技術者試験のビット演算では、ビット列の必要な部分だけを残したり、特定の桁を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桁をそろえて書きます。

  1. 何ビットの値を操作するかを確認する。
  2. 残す、0にする、1にする、反転する位置を問題文から決める。
  3. 選択肢のマスクを同じ桁数の2進数に直す。
  4. 演算ごとに、マスクの0と1が元の桁へどう作用するか確かめる。
  5. 必要なら元の桁が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の両方で確かめる。この順番を繰り返せば、初めて見るマスクでも手順に沿って解けます。

読んだあとは、一問チャレンジ。

学んだことを思い出しながら、キホン猫と過去問を解いてみよう。

過去問を解いてみる →