資格道場 › レッスン一覧 › 基礎理論
基礎理論・6/13・12分

ビットマスクと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かどうかを見ます。

7F(01111111)とANDをとるMSB元の値10110101マスク7F01111111AND結果00110101マスクが0の位置 → 0に消えるマスクが1の位置 → 元の値がそのまま残る
7F(01111111)とANDをとると、マスクが0の最上位ビットだけが0に消え、残り7ビットは元の値のまま残る。

ANDとシフトで16進数を1桁ずつ取り出す

論理シフトとは、ビット列を左右にずらし、空いた位置に0を入れる操作です。右に4ビットずらすと、16進数1桁分だけ下の位へ移ります。

16ビットの値を下位の桁から1桁ずつ取り出す手順は、次の2つの繰り返しです。

  1. 000F(下位4ビットだけ1)とAND → 一番下の16進1桁が取れる
  2. 右に4ビット論理シフト → 次の桁が一番下に来る

スタックは、最後に入れたものを最初に取り出す入れ物です。この問題では、取り出した桁を順に積むためだけに使われています。

下位の桁から1桁ずつ取り出す3A7C03A7003A0003右へ4ビット右へ4ビット右へ4ビットAND 000FAND 000FAND 000FAND 000FC7A3スタック3A7C先に取った桁が下
000FとのANDで一番下の16進1桁を取り、右に4ビット論理シフトして次の桁を下に寄せる、を繰り返して取り出した桁をスタックに積む(値3A7Cの例)。

XORで反転する

XORは、マスクの1の位置だけを反転させます。電灯のスイッチのように、押した場所だけ点灯と消灯が入れ替わります。

  • 全ビット反転 → FFとXOR(00とのXORでは何も変わらない)
  • 下位2ビットはそのまま、上位6ビットを反転 → FC(11111100)とXOR(03は下位2ビット側なので逆)

ORでは、マスクの1の位置は1に固定されるだけで反転にはなりません。

XORは2回かけると元に戻る(鍵の逆算)

XORには同じ値と2回XORすると打ち消し合って元に戻る性質があり、順番を入れ替えても結果は同じです。このため、XORを何段も重ねた式でも、分かっている値をすべてXORすれば未知の値を逆算できます。暗号の鍵を逆算する問題は、この性質を使えば解けます。

平文 P1011 0010XOR 鍵K0110 1100暗号文 C1101 1110XOR 鍵K0110 1100平文 P1011 0010同じ鍵Kで2回XORすると打ち消し合うP XOR K XOR K = P
平文Pに鍵KをXORすると暗号文Cになり、同じ鍵Kをもう一度XORすると打ち消し合って平文Pに戻る。

最も右にある1だけを残す(手順問題)

A−1をBとすると、Aの最も右にある1から右側のビットがすべて反転します。A XOR B を計算すると、その範囲だけが1になったマスクCができます。最後に A AND C をとると、最も右の1だけが残ります。手順の穴埋めで問われ、正解はANDです。

反転する範囲A01101000B = A−101100111C = A XOR B00001111A AND C00001000最も右にある1だけが残る
A−1で最も右の1から右側が反転し、A XOR Bでその範囲だけ1のマスクCができ、A AND Cで最も右の1だけが残る。

試験での問われ方

  • 正解のANDの横に、同じマスク値のOR・XOR・NANDが並ぶ。演算の役割(取り出す/1にする/反転)で絞り込む
  • 0Fと7F、F0と0F、FCと03のように、似たマスク値で迷わせる。2進数に直してから判定する
  • シフト方向(左か右か)とマスク(000FかFFF0か)を組み合わせた4択
  • XORの計算問題では、途中の1か所の計算ミスがそのまま他の選択肢になるように作られている。最後に元の式へ代入して検算する
例題 1

パリティビット以外の下位7ビットを得る

最上位をパリティビットとする 8 ビット符号において,パリティビット以外の下位 7 ビットを得るためのビット演算はどれか。

ア 16 進数 0F との AND をとる。
イ 16 進数 0F との OR をとる。
ウ 16 進数 7F との AND をとる。
エ 16 進数 FF との XOR(排他的論理和)をとる。

出典:平成31年度 春期 基本情報技術者試験 午前 問2

解き方と答えを見る
  1. 8ビットのうち、最上位(左端)の1ビットを消し、下位7ビットを残したい
  2. 「取り出す」操作なのでANDを使う。残したい位置を1、消したい位置を0にしたマスクを作る
  3. マスク=0111 1111(2進)=7F(16進)
  4. 例:1010 1100 AND 0111 1111 = 0010 1100。最上位が0になり、下位7ビット 010 1100 はそのまま
  5. ア(0FとAND)は下位4ビットしか残らない。イ(OR)は1にする操作、エ(FFとXOR)は全ビット反転なので、どちらも不適

答え:ウ(16進数7FとのAND)

例題 2

16ビットを16進数の1桁ずつに分ける

16 ビットの 2 進数 n を 16 進数の各桁に分けて,下位の桁から順にスタックに格納するために,次の手順を 4 回繰り返す。a, b に入る適切な語句の組合せはどれか。ここで,XXXX₁₆は 16 進数 XXXX を表す。 〔手順〕 (1) a をxに代入する。 (2) x をスタックにプッシュする。 (3) n を b 論理シフトする。
ab
ア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 ビット

出典:平成25年度 春期 基本情報技術者試験 午前 問1

解き方と答えを見る
  1. 例として n = 1A2B₁₆ = 0001 1010 0010 1011 とする
  2. 1回目:n AND 000F₁₆ = 0000 0000 0000 1011 = B → プッシュ
  3. n を右に4ビット論理シフト → 0000 0001 1010 0010 = 01A2₁₆
  4. 2回目:AND 000F₁₆ → 2。右シフト → 001A₁₆
  5. 3回目:A、4回目:1。下位の桁から B, 2, A, 1 の順に取り出せた
  6. FFF0とANDすると下位桁が消える。左シフトでは上位桁が一番下に来ない。どちらも不適

答え:イ(a: n AND 000F₁₆/b: 右に4ビット)

例題 3

最も右の1だけを残すアルゴリズム

次に示す手順は,列中の少なくとも一つは 1 であるビット列が与えられたとき,最も右にある 1 を残し,他のビットを全て 0 にするアルゴリズムである。例えば,00101000 が与えられたとき,00001000 が求まる。a に入る論理演算はどれか。 手順 1 与えられたビット列 A を符号なしの 2 進数と見なし,A から 1 を引き,結果を B とする。 手順 2 A と B の排他的論理和(XOR)を求め,結果を C とする。 手順 3 A と C の [a] を求め,結果を A とする。

ア 排他的論理和(XOR)
イ 否定論理積(NAND)
ウ 論理積(AND)
エ 論理和(OR)

出典:平成30年度 秋期 基本情報技術者試験 午前 問2

解き方と答えを見る
  1. A = 00101000
  2. 手順1:B = A − 1 = 00100111(最も右の1から右側が反転する)
  3. 手順2:C = A XOR B = 00101000 XOR 00100111 = 00001111
  4. 手順3:A AND C = 00101000 AND 00001111 = 00001000
  5. 問題文の答え 00001000 と一致するので、a は論理積(AND)

答え:ウ(論理積 AND)

例題 4

XORの性質で変更後の鍵を逆算する

内部鍵との排他的論理和を 4 ビット単位で実行するユニット A,B,C から構成される装置がある。この装置では,入力ビット列 1101 を与えると,出力ビット列 0100 が得られる。ここで,ユニット B の内部鍵を変更したところ,出力ビット列が 1111 になった。変更後のユニット B の内部鍵はどれか。
入力ビット列 1101 → ユニットA(排他的論理和,内部鍵 0001)→ ユニットB(排他的論理和,内部鍵 0101)→ ユニットC(排他的論理和,内部鍵 1101)→ 出力ビット列 0100

ア 1011
イ 1100
ウ 1101
エ 1110

出典:基本情報技術者試験 科目A免除 修了試験 20130728 実施分 問2

解き方と答えを見る
  1. 装置は 入力 ⊕ A鍵 ⊕ B鍵 ⊕ C鍵 = 出力
  2. 検算(変更前):1101 ⊕ 0001 = 1100、1100 ⊕ 0101 = 1001、1001 ⊕ 1101 = 0100。図の出力と一致
  3. 変更後:1101 ⊕ 0001 ⊕ B ⊕ 1101 = 1111
  4. 入力と鍵Cはどちらも1101で、同じ値どうしは打ち消し合う → 0001 ⊕ B = 1111
  5. 両辺に0001をXOR:B = 1111 ⊕ 0001 = 1110
  6. 検算: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で指定するビット列。
AND 論理積(Logical AND)
両方が1のときだけ1になる演算で、マスクの1の位置の値だけを残す。
⚠ ORと混同しやすい。ANDは「残す・取り出す」、ORは「1にする」と覚える
OR 論理和(Logical OR)
どちらかが1なら1になる演算で、マスクの1の位置を必ず1にする。
⚠ XORと混同しやすい。ORは1に固定するだけで、反転はしない
XOR 排他的論理和(Exclusive OR)
2つの値が異なるときだけ1になる演算で、マスクの1の位置を反転させる。
⚠ ORと違い、1と1のXORは0になる。同じ値と2回XORすると元に戻る
NAND 否定論理積(Not AND)
ANDの結果を反転させる演算。
⚠ ANDと異なり、0FとのNANDでは下位4ビットが反転し、上位4ビットは1になる
ビット反転 びっとはんてん
0を1に、1を0に入れ替える操作で、FFとのXORで全ビットを反転できる。
⚠ 00とのXORでは何も変わらない。FFとのORでは全ビットが1になるだけ
論理シフト ろんりしふと
ビット列を左右にずらし、空いた位置に0を入れる操作。
⚠ 右シフトは下の位へ、左シフトは上の位へ動く。下位から順に取り出すなら右
パリティビット ぱりてぃびっと
データの誤りを検出するために付け加える1ビットで、データ本体ではない。
最上位ビット MSB(Most Significant Bit)
ビット列の一番左にある、最も大きい位のビット。
⚠ 最下位ビット(LSB)は一番右のビット
最下位ビット LSB(Least Significant Bit)
ビット列の一番右にある、最も小さい位のビット。
⚠ 最上位ビット(MSB)は一番左のビット
16進数 じゅうろくしんすう
0〜9とA〜Fで数を表す方式で、1桁が2進数の4ビットにあたる。
⚠ 0Fは下位4ビット、F0は上位4ビット。左右を取り違えない
スタック すたっく
最後に入れたデータを最初に取り出す(後入れ先出し)データ構造。
⚠ キューは最初に入れたデータを最初に取り出す(先入れ先出し)

このレッスンの過去問

このレッスンで稽古する