パリティとCRCによる誤り検出
パリティビットを自分で付けて16進数で答えられ、垂直パリティとCRCがそれぞれ何を検出できるかを選択肢から見分けられるようになる。
通信や記憶装置では、ノイズでビットが反転することがあります。受け取ったデータが壊れていないかを安く確かめる方法として、パリティとCRCは今も使われています。試験では「何ができて何ができないか」と「パリティを付けた結果」の2つが繰り返し問われます。
このレッスンで稽古する(用語チェック・過去問)結論:おまけのビットを付けて照合する
誤り検出とは、データにおまけの情報を付けて送り、受け取った側で照合して「壊れたかどうか」を判定することです。誤り訂正は、壊れた場所まで突き止めて直すことを指し、検出より一段上の能力です。
このレッスンで覚えることは3つだけです。
- パリティ:1の個数を偶数か奇数にそろえる。検出だけできて、訂正はできない
- パリティの計算:1を数えて、そろえるために0か1を付ける。XORで式にもできる
- CRC:生成多項式で割った余りを付ける。受信側は割り切れるかどうかで判定する
パリティチェック:1の個数をそろえる
パリティビットは、データに1ビットだけ足して、全体の1の個数を決まった偶奇にするビットです。たとえるなら「卵はいつも偶数個で箱詰めする」と決めておくようなものです。届いた箱の卵が奇数個なら、途中で何かが起きたと分かります。
| 方式 | 決まり | データの1が奇数個なら | データの1が偶数個なら |
|---|---|---|---|
| 偶数パリティ | 全体の1の個数を偶数にする | パリティ=1 | パリティ=0 |
| 奇数パリティ | 全体の1の個数を奇数にする | パリティ=0 | パリティ=1 |
受信側は1の個数を数え直し、決まりと違えば「誤りあり」と判定します。偶数と奇数のどちらを選んでも、検出能力は同じです。
垂直パリティの検出能力(最頻出)
垂直パリティチェックは、1文字(7〜8ビット)ごとにパリティビットを1つ付ける方式です。卵のたとえでいえば、2個割れても箱の中は偶数個のままなので気付けません。つまり奇数個のビット誤りは検出でき、偶数個の誤りは見逃します。
| 何ビット反転したか | 垂直パリティで検出できるか |
|---|---|
| 1ビット | できる |
| 2ビット | できない(偶奇が変わらない) |
| 3ビット | できる |
| どのビットが反転したか | 分からない → 訂正できない |
選択肢では、ほかの方式の能力とすり替えてきます。下の比較表で区別しておきましょう。
| 方式 | 仕組み | 検出 | 訂正 |
|---|---|---|---|
| 垂直パリティ | 1文字ごとにパリティビットを付ける | 奇数個の誤り(1ビットなら必ず) | できない |
| 水平パリティ | 複数文字の同じ桁ごとにパリティを付ける | 奇数個の誤り | できない |
| 水平垂直パリティ | 垂直と水平を組み合わせる | 1ビットの誤り | 1ビットなら可能(縦と横の交点で場所が分かる) |
| ハミング符号 | 複数のパリティビットで位置を特定する | 2ビットまで | 1ビット |
| CRC | 生成多項式で割った余りを付ける | 連続した誤り(バースト誤り)に強い | できない |
パリティを付けて16進数で答える近道
7ビットの文字コードの先頭(8ビット目)にパリティを付ける問題は、次の手順で解けます。
- 16進数の各桁を2進数4ビットに直す(先頭の桁は実質3ビット)
- 1の個数を数える
- 偶数パリティなら、1が奇数個のときだけ先頭に1を付ける
先頭に1を付けることは、16進数の上の桁に8を足すことと同じです(先頭ビットは8の位にあたるため)。そのため3→B、4→C、5→D、7→Fと書き換えるだけで済みます。
| 16進の1桁 | 2進数 | 1の個数 |
|---|---|---|
| 0 | 0000 | 0 |
| 3 | 0011 | 2 |
| 4 | 0100 | 1 |
| 5 | 0101 | 2 |
| 7 | 0111 | 3 |
| A | 1010 | 2 |
| F | 1111 | 4 |
XORで書くパリティの式
前のレッスンで扱った**XOR(排他的論理和)**には、多くのビットをXORでつなぐと「1の個数が奇数なら1、偶数なら0」になる性質があります。これはそのままパリティの判定に使えます。
| データ部分だけのXORとの関係 | データとパリティすべてのXOR | |
|---|---|---|
| 偶数パリティ | p = d0 ⊕ … ⊕ d7 | = 0 |
| 奇数パリティ | p = d0 ⊕ … ⊕ d7 ⊕ 1 | = 1 |
覚え方は「全部XORした結果は、全体の1の個数の偶奇そのもの」です。奇数パリティなら全体が奇数なので1、偶数パリティなら0になります。
CRC方式:割り算の余りで確かめる
CRC(巡回冗長検査)は、送るビット列を生成多項式(送信側と受信側で決めておく割る数)で割り、その余りを末尾に付けて送る方式です。受信側は届いたビット列全体を同じ生成多項式で割り、割り切れれば正常、余りが出れば誤りと判定します。マイナンバーのチェックデジットのように「割り算で検算する」仕組みと考えると分かりやすいでしょう。
flowchart LR
A["送信側: データを生成多項式で割る"] --> B["余りをデータの後ろに付けて送信"]
B --> C["受信側: 全体を同じ生成多項式で割る"]
C --> D["割り切れる → 誤りなし"]
C --> E["余りが出る → 誤りあり"]
試験で問われるのは、ほぼ定義そのものです。問題文に「生成多項式」「割った余り」「割り切れるか」という言葉があれば、答えはCRCです。CRCはネットワーク(イーサネット)やファイル圧縮などで、連続したビット誤り(バースト誤り)の検出に使われます。
文字コード 30・3F・7A に偶数パリティを付ける
ア 30,3F,7A
イ 30,3F,FA
ウ B0,3F,FA
エ B0,BF,7A
出典:基本情報技術者試験 科目A免除 修了試験 20241208 実施分 問3
解き方と答えを見る
- 30 を2進数にする:3=011、0=0000 → 011 0000。1の個数は 2個(偶数)
- 偶数パリティなので、すでに偶数ならパリティは 0 → 0011 0000 = 30 のまま
- 3F を2進数にする:3=011、F=1111 → 011 1111。1の個数は 2+4=6個(偶数)→ パリティ 0 → 3F のまま
- 7A を2進数にする:7=111、A=1010 → 111 1010。1の個数は 3+2=5個(奇数)
- 全体を偶数にするため、パリティ 1 を先頭に付ける → 1111 1010 = FA(上の桁 7+8=F と考えてもよい)
- 結果は 30,3F,FA。選択肢と照らし合わせる
答え:イ(30,3F,FA)
「ET」をASCIIで表し、偶数パリティを付けて16進数にする
| b4 | b3 | b2 | b1 | b7b6b5=100 | b7b6b5=101 |
|---|---|---|---|---|---|
| 0 | 0 | 0 | 0 | @ | P |
| 0 | 0 | 0 | 1 | A | Q |
| 0 | 0 | 1 | 0 | B | R |
| 0 | 0 | 1 | 1 | C | S |
| 0 | 1 | 0 | 0 | D | T |
| 0 | 1 | 0 | 1 | E | U |
| 0 | 1 | 1 | 0 | F | V |
| 0 | 1 | 1 | 1 | G | W |
ア 4554
イ A32B
ウ ACA5
エ C5D4
出典:基本情報技術者試験 科目A免除 修了試験 20120624 実施分 問80
解き方と答えを見る
- 表から E の位置を読む:b7b6b5=100、b4b3b2b1=0101 → 100 0101 = 16進数で 45
- E の1の個数:1+0+0+0+1+0+1=3個(奇数)→ パリティ 1 を8ビット目に付ける → 1100 0101 = C5
- 表から T の位置を読む:b7b6b5=101、b4b3b2b1=0100 → 101 0100 = 16進数で 54
- T の1の個数:1+0+1+0+1+0+0=3個(奇数)→ パリティ 1 → 1101 0100 = D4
- つなげると C5D4。パリティを付けていない 4554(ア)を選ばないよう注意する
答え:エ(C5D4)
奇数パリティで常に成り立つXORの式を選ぶ
ア 0 ⊕ d0 ⊕ d1 ⊕ … ⊕ d7 = p
イ d0 ⊕ d1 ⊕ … ⊕ d7 = p
ウ d0 ⊕ d1 ⊕ … ⊕ d7 ⊕ p = 0
エ d0 ⊕ d1 ⊕ … ⊕ d7 ⊕ p = 1
出典:基本情報技術者試験 科目A免除 修了試験 20230122 実施分 問5
解き方と答えを見る
- 奇数パリティの決まり:d0〜d7 と p を合わせた全体の1の個数は必ず奇数
- XORで全ビットをつなぐと、1の個数が奇数なら結果は 1 になる
- したがって d0 ⊕ d1 ⊕ … ⊕ d7 ⊕ p = 1 が常に成り立つ
- ウ(=0)は偶数パリティの式。イは「p=データのXOR」で、これも偶数パリティの付け方
- アは 0⊕x=x なのでイと同じ意味になる。同じ意味の選択肢が2つある時点で、どちらも正解ではないと判断できる
答え:エ(d0 ⊕ d1 ⊕ … ⊕ d7 ⊕ p = 1)
要点(試験直前に読む)
- 垂直パリティは奇数パリティでも偶数パリティでも1ビットの誤りを検出できる。偶数個の誤りは見逃し、訂正はできない
- 偶数パリティ:データの1が奇数個なら1を付ける。先頭に1を付けると、16進数の上の桁が8増える(3→B、4→C、5→D、7→F)
- 全ビット(データとパリティ)のXORは、奇数パリティなら1、偶数パリティなら0
- 「生成多項式」「余り」「割り切れるか」と書かれていたらCRC方式
- 1ビット訂正・2ビット検出はハミング符号。水平垂直パリティも1ビットなら訂正できる
ひっかけ
- 「1ビット訂正・2ビット検出」は垂直パリティの説明ではなく、ハミング符号の説明
- 「偶数パリティでは1ビットの誤りを検出できない」は誤り。偶数と奇数で検出能力は変わらない
- パリティを付けた結果を問う問題では、パリティなしのコード(4554 や 30,3F,7A)がそのまま選択肢に紛れている。1が奇数個のコードに1を付け忘れていないか確認する
- XORの式の問題では、=0 は偶数パリティ、=1 は奇数パリティ。意味が同じ選択肢(0⊕x と x)が2つあれば、両方とも消去できる
- CRCとハミング符号の取り違えに注意。割り算(多項式)を使うのはCRCで、訂正できるのはハミング符号
用語(14)
受け取ったデータが途中で壊れたかどうかを判定すること。
⚠ 誤り訂正は、壊れた場所を突き止めて直すことまで含む。パリティとCRCは検出だけ。
誤りがあるビットの位置を特定し、正しい値に直すこと。
⚠ ハミング符号と水平垂直パリティ(1ビット)は訂正できる。垂直パリティ単体とCRCはできない。
全体の1の個数の偶奇をそろえるために、データに付け足す1ビット。
データとパリティビットを合わせた1の個数が偶数になるようにする方式。
⚠ 奇数パリティとは決まりが逆なだけで、検出能力は同じ。全ビットのXORが0になるのは偶数パリティ。
データとパリティビットを合わせた1の個数が奇数になるようにする方式。
⚠ 全ビットのXORが1になるのは奇数パリティ。偶数パリティの式(=0)と取り違えやすい。
1文字ごとにパリティビットを1つ付けて検査する方式で、奇数個のビット誤りを検出できる。
⚠ 水平パリティは複数文字の同じ桁ごとに付ける。どちらも単体では訂正できない。
複数の文字をまとめたブロックで、同じ桁のビットごとにパリティを付けて検査する方式。
⚠ 垂直パリティは1文字単位。両方を組み合わせた水平垂直パリティなら1ビットの誤りを訂正できる。
垂直パリティと水平パリティを組み合わせ、縦と横が交わる位置から1ビットの誤りを特定して訂正できる方式。
⚠ 垂直パリティ単体には訂正能力がない。
複数の検査ビットを使い、1ビットの誤りを訂正し、2ビットの誤りを検出できる符号。
⚠ 「1ビット訂正・2ビット検出」と書かれた選択肢はハミング符号の説明で、垂直パリティではない。
ビット列を生成多項式で割った余りを付けて送り、受信側で割り切れるかどうかで誤りを検出する方式。
⚠ パリティは1の個数を数える方式で、割り算をしない。ハミング符号は訂正もできる。
CRCで、送信側と受信側があらかじめ決めておく「割る数」にあたるビット列。
2つのビットが異なれば1、同じなら0を返す演算。多くのビットをつなぐと、1の個数が奇数なら1になる。
⚠ 論理和(OR)は、どちらかが1なら1になる。1⊕1=0 になる点が違う。
英数字や記号を7ビットで表す文字コードで、8ビット目をパリティに使うことがある。
連続した複数のビットがまとめて反転する誤り。
⚠ パリティは偶数個の誤りを見逃すため、バースト誤りの検出にはCRCが向いている。
このレッスンの過去問
- パリティチェックの検出能力(垂直パリティ)平成25年度 春期 基本情報技術者試験 午前 問4
- 偶数パリティビットの付加計算基本情報技術者試験 科目A免除 修了試験 20241208 実施分 問3
- 偶数パリティビットを付加したASCIIコードの16進表記基本情報技術者試験 科目A免除 修了試験 20251214 実施分 問3
- 奇数パリティの検査式(XOR)基本情報技術者試験 科目A免除 修了試験 20230122 実施分 問5
- CRC方式の定義平成29年度 秋期 基本情報技術者試験 午前 問2