ビットマスクとXORを使ったビット操作
マスク(0と1を並べた型)とAND・OR・XORを組み合わせて、ビットを「取り出す」「1にする」「反転する」「逆算する」問題を自力で解けるようになる。16進数のマスク値を2進数に直して、どのビットが残るかを判定できるようになる。
ビット演算は科目Aで繰り返し出題されます。選択肢は「16進数○○とANDをとる」のような形で並び、演算の種類とマスク値の組合せを1つずつ確かめれば正解できます。通信データのチェックや暗号の基本にもなる考え方です。
このレッスンで稽古する(用語チェック・過去問)結論:演算ごとにマスクの役割が決まっている
マスクとは、操作したいビットの位置を0と1で示した型のビット列です。マスキングテープのように、どこに効かせてどこを守るかを決めます。どの演算を使うかで、マスクの1の位置に起こることが決まります。
| 演算 | マスクのビットが 0 の位置 | マスクのビットが 1 の位置 | 用途 |
|---|---|---|---|
| AND(論理積) | 必ず0になる(消える) | 元の値がそのまま残る | 取り出す(保持する) |
| OR(論理和) | 元の値がそのまま残る | 必ず1になる | 特定ビットを1にする |
| XOR(排他的論理和) | 元の値がそのまま残る | 反転する(0↔1) | 特定ビットを反転する |
この表だけで、このレッスンの問題の半分以上は解けます。AND・OR・XORそれぞれについて、マスクの1の位置で何が起こるかを答えられるようにしてください。
16進数のマスクは、まず2進数に直す
16進数1桁は2進数の4ビットにあたります。マスクを見たら、まず2進数に書き直します。
| 16進 | 2進(8ビット) | ANDで残る部分 | XORで反転する部分 |
|---|---|---|---|
| 0F | 0000 1111 | 下位4ビット | 下位4ビット |
| 7F | 0 1111111 | 下位7ビット | 下位7ビット |
| F0 | 1111 0000 | 上位4ビット | 上位4ビット |
| FC | 111111 00 | 上位6ビット | 上位6ビット |
| 03 | 000000 11 | 下位2ビット | 下位2ビット |
| FF | 11111111 | 全ビット | 全ビット |
| 00 | 00000000 | 何も残らない(全部0) | 何も変わらない |
**最上位ビット(MSB)**は一番左、**最下位ビット(LSB)**は一番右のビットです。たとえば「最上位がパリティビット」なら、左端の1ビットを除いた残り7ビットがデータです。
ANDマスクで下位ビットを取り出す(最頻出)
取り出す・保持する・変化させないと問われたら、答えはANDです。残したい位置を1、消したい位置を0にしたマスクを用意します。
- 下位7ビットを得る → 7F(01111111)とAND。最上位ビットだけ0になる
- 下位4ビットを変化させない → 0F(00001111)とAND。上位4ビットは0になるが、下位4ビットは元のまま
- 16の倍数かどうか判定する → 16の倍数は下位4ビットがすべて0の数。そこで 00001111とAND をとり、結果が0なら16の倍数
16の倍数の判定は、10進数で「下2桁が00なら100の倍数」と見分けるのと同じ考え方です。2進数では16=10000なので、下位4ビットが0000かどうかを見ます。
ANDとシフトで16進数を1桁ずつ取り出す
論理シフトとは、ビット列を左右にずらし、空いた位置に0を入れる操作です。右に4ビットずらすと、16進数1桁分だけ下の位へ移ります。
16ビットの値を下位の桁から1桁ずつ取り出す手順は、次の2つの繰り返しです。
- 000F(下位4ビットだけ1)とAND → 一番下の16進1桁が取れる
- 右に4ビット論理シフト → 次の桁が一番下に来る
スタックは、最後に入れたものを最初に取り出す入れ物です。この問題では、取り出した桁を順に積むためだけに使われています。
XORで反転する
XORは、マスクの1の位置だけを反転させます。電灯のスイッチのように、押した場所だけ点灯と消灯が入れ替わります。
- 全ビット反転 → FFとXOR(00とのXORでは何も変わらない)
- 下位2ビットはそのまま、上位6ビットを反転 → FC(11111100)とXOR(03は下位2ビット側なので逆)
ORでは、マスクの1の位置は1に固定されるだけで反転にはなりません。
XORは2回かけると元に戻る(鍵の逆算)
XORには同じ値と2回XORすると打ち消し合って元に戻る性質があり、順番を入れ替えても結果は同じです。このため、XORを何段も重ねた式でも、分かっている値をすべてXORすれば未知の値を逆算できます。暗号の鍵を逆算する問題は、この性質を使えば解けます。
最も右にある1だけを残す(手順問題)
A−1をBとすると、Aの最も右にある1から右側のビットがすべて反転します。A XOR B を計算すると、その範囲だけが1になったマスクCができます。最後に A AND C をとると、最も右の1だけが残ります。手順の穴埋めで問われ、正解はANDです。
試験での問われ方
- 正解のANDの横に、同じマスク値のOR・XOR・NANDが並ぶ。演算の役割(取り出す/1にする/反転)で絞り込む
- 0Fと7F、F0と0F、FCと03のように、似たマスク値で迷わせる。2進数に直してから判定する
- シフト方向(左か右か)とマスク(000FかFFF0か)を組み合わせた4択
- XORの計算問題では、途中の1か所の計算ミスがそのまま他の選択肢になるように作られている。最後に元の式へ代入して検算する
パリティビット以外の下位7ビットを得る
ア 16 進数 0F との AND をとる。
イ 16 進数 0F との OR をとる。
ウ 16 進数 7F との AND をとる。
エ 16 進数 FF との XOR(排他的論理和)をとる。
解き方と答えを見る
- 8ビットのうち、最上位(左端)の1ビットを消し、下位7ビットを残したい
- 「取り出す」操作なのでANDを使う。残したい位置を1、消したい位置を0にしたマスクを作る
- マスク=0111 1111(2進)=7F(16進)
- 例:1010 1100 AND 0111 1111 = 0010 1100。最上位が0になり、下位7ビット 010 1100 はそのまま
- ア(0FとAND)は下位4ビットしか残らない。イ(OR)は1にする操作、エ(FFとXOR)は全ビット反転なので、どちらも不適
答え:ウ(16進数7FとのAND)
16ビットを16進数の1桁ずつに分ける
| a | b | |
|---|---|---|
| ア | n AND 000F₁₆ | 左に 4 ビット |
| イ | n AND 000F₁₆ | 右に 4 ビット |
| ウ | n AND FFF0₁₆ | 左に 4 ビット |
| エ | n AND FFF0₁₆ | 右に 4 ビット |
ア a: n AND 000F₁₆ / b: 左に 4 ビット
イ a: n AND 000F₁₆ / b: 右に 4 ビット
ウ a: n AND FFF0₁₆ / b: 左に 4 ビット
エ a: n AND FFF0₁₆ / b: 右に 4 ビット
解き方と答えを見る
- 例として n = 1A2B₁₆ = 0001 1010 0010 1011 とする
- 1回目:n AND 000F₁₆ = 0000 0000 0000 1011 = B → プッシュ
- n を右に4ビット論理シフト → 0000 0001 1010 0010 = 01A2₁₆
- 2回目:AND 000F₁₆ → 2。右シフト → 001A₁₆
- 3回目:A、4回目:1。下位の桁から B, 2, A, 1 の順に取り出せた
- FFF0とANDすると下位桁が消える。左シフトでは上位桁が一番下に来ない。どちらも不適
答え:イ(a: n AND 000F₁₆/b: 右に4ビット)
最も右の1だけを残すアルゴリズム
ア 排他的論理和(XOR)
イ 否定論理積(NAND)
ウ 論理積(AND)
エ 論理和(OR)
解き方と答えを見る
- A = 00101000
- 手順1:B = A − 1 = 00100111(最も右の1から右側が反転する)
- 手順2:C = A XOR B = 00101000 XOR 00100111 = 00001111
- 手順3:A AND C = 00101000 AND 00001111 = 00001000
- 問題文の答え 00001000 と一致するので、a は論理積(AND)
答え:ウ(論理積 AND)
XORの性質で変更後の鍵を逆算する
ア 1011
イ 1100
ウ 1101
エ 1110
出典:基本情報技術者試験 科目A免除 修了試験 20130728 実施分 問2
解き方と答えを見る
- 装置は 入力 ⊕ A鍵 ⊕ B鍵 ⊕ C鍵 = 出力
- 検算(変更前):1101 ⊕ 0001 = 1100、1100 ⊕ 0101 = 1001、1001 ⊕ 1101 = 0100。図の出力と一致
- 変更後:1101 ⊕ 0001 ⊕ B ⊕ 1101 = 1111
- 入力と鍵Cはどちらも1101で、同じ値どうしは打ち消し合う → 0001 ⊕ B = 1111
- 両辺に0001をXOR:B = 1111 ⊕ 0001 = 1110
- 検算:1101 ⊕ 0001 = 1100、1100 ⊕ 1110 = 0010、0010 ⊕ 1101 = 1111。一致する
答え:エ(1110)
要点(試験直前に読む)
- 取り出す・変化させない=AND/1にする=OR/反転=XOR
- マスクは必ず2進数に直す:0F=00001111、7F=01111111、FC=11111100、FF=11111111
- 16の倍数の判定:00001111とANDして結果が0なら16の倍数
- 16進1桁ずつ下から取り出す:000FとAND → 右に4ビットシフト を繰り返す
- XORは同じ値と2回かけると元に戻る。逆算は、分かっている値を全部XORする
- 最右の1だけ残す:C = A XOR (A−1)、A AND C
ひっかけ
- 同じマスク値でOR・XOR・NANDが並ぶ → 問題文の「取り出す」「反転」を演算の役割と照らし合わせる
- 0Fと7F、FCと03のように似たマスク値が並ぶ → 2進数に直し、1の位置が残したい範囲と一致するか数える
- 16の倍数の判定で11110000とのANDを選ばせる → 調べるのは下位4ビットなので、マスクは00001111
- シフト方向とマスクを組み合わせた4択 → 下位から順に取り出すなら、マスクは000F、シフトは右
- XORの穴埋めでは、途中の計算ミスがそのまま他の選択肢になっている → 求めた値を元の式に入れて検算する
用語(12)
演算の相手として使い、どのビットを操作するかを0と1で指定するビット列。
両方が1のときだけ1になる演算で、マスクの1の位置の値だけを残す。
⚠ ORと混同しやすい。ANDは「残す・取り出す」、ORは「1にする」と覚える
どちらかが1なら1になる演算で、マスクの1の位置を必ず1にする。
⚠ XORと混同しやすい。ORは1に固定するだけで、反転はしない
2つの値が異なるときだけ1になる演算で、マスクの1の位置を反転させる。
⚠ ORと違い、1と1のXORは0になる。同じ値と2回XORすると元に戻る
ANDの結果を反転させる演算。
⚠ ANDと異なり、0FとのNANDでは下位4ビットが反転し、上位4ビットは1になる
0を1に、1を0に入れ替える操作で、FFとのXORで全ビットを反転できる。
⚠ 00とのXORでは何も変わらない。FFとのORでは全ビットが1になるだけ
ビット列を左右にずらし、空いた位置に0を入れる操作。
⚠ 右シフトは下の位へ、左シフトは上の位へ動く。下位から順に取り出すなら右
データの誤りを検出するために付け加える1ビットで、データ本体ではない。
ビット列の一番左にある、最も大きい位のビット。
⚠ 最下位ビット(LSB)は一番右のビット
ビット列の一番右にある、最も小さい位のビット。
⚠ 最上位ビット(MSB)は一番左のビット
0〜9とA〜Fで数を表す方式で、1桁が2進数の4ビットにあたる。
⚠ 0Fは下位4ビット、F0は上位4ビット。左右を取り違えない
最後に入れたデータを最初に取り出す(後入れ先出し)データ構造。
⚠ キューは最初に入れたデータを最初に取り出す(先入れ先出し)
このレッスンの過去問
- ビット演算による下位ビットの保持(論理積マスク)平成31年度 春期 基本情報技術者試験 午前 問2
- 論理積(AND)マスクとシフトによる16進桁の抽出平成26年度 春期 基本情報技術者試験 午前 問2
- 最右ビット抽出アルゴリズム(AND)平成30年度 秋期 基本情報技術者試験 午前 問2
- 全ビット反転操作(XOR FF)令和元年度 秋期 基本情報技術者試験 午前 問2
- 排他的論理和(XOR)の連鎖と鍵の逆算基本情報技術者試験 科目A免除 修了試験 20180128 実施分 問2