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

パリティと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を偶数個にそろえるPデータ7ビット?10110001は3個(奇数)→ パリティ=111011000全体の1は4個(偶数)にして送る
偶数パリティでは、データの1が3個(奇数)なのでパリティを1にして、全体を4個(偶数)にそろえて送る。

垂直パリティの検出能力(最頻出)

垂直パリティチェックは、1文字(7〜8ビット)ごとにパリティビットを1つ付ける方式です。卵のたとえでいえば、2個割れても箱の中は偶数個のままなので気付けません。つまり奇数個のビット誤りは検出でき、偶数個の誤りは見逃します。

何ビット反転したか 垂直パリティで検出できるか
1ビット できる
2ビット できない(偶奇が変わらない)
3ビット できる
どのビットが反転したか 分からない → 訂正できない

選択肢では、ほかの方式の能力とすり替えてきます。下の比較表で区別しておきましょう。

方式 仕組み 検出 訂正
垂直パリティ 1文字ごとにパリティビットを付ける 奇数個の誤り(1ビットなら必ず) できない
水平パリティ 複数文字の同じ桁ごとにパリティを付ける 奇数個の誤り できない
水平垂直パリティ 垂直と水平を組み合わせる 1ビットの誤り 1ビットなら可能(縦と横の交点で場所が分かる)
ハミング符号 複数のパリティビットで位置を特定する 2ビットまで 1ビット
CRC 生成多項式で割った余りを付ける 連続した誤り(バースト誤り)に強い できない
送ったもの(1が4個・偶数)110110001ビット反転111110001が5個(奇数)→ 検出できる2ビット反転111110101が6個(偶数)→ 見逃すどこが反転したかは分からない→訂正不可
1が4個の偶数パリティのデータで、1ビット反転すると5個(奇数)になり検出できるが、2ビット反転すると6個(偶数)のままで見逃す。

パリティを付けて16進数で答える近道

7ビットの文字コードの先頭(8ビット目)にパリティを付ける問題は、次の手順で解けます。

  1. 16進数の各桁を2進数4ビットに直す(先頭の桁は実質3ビット)
  2. 1の個数を数える
  3. 偶数パリティなら、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
例:34(16進)に偶数パリティを付ける34001101001は3個(奇数)→ 先頭を1にする10110100B4先頭の1は8の位:3+8=B答え:B4
7ビットの文字コード 34(16進)は1が3個なので先頭に1を付け、8の位が増えて3がBになり、答えはB4になる。

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はネットワーク(イーサネット)やファイル圧縮などで、連続したビット誤り(バースト誤り)の検出に使われます。

例題 1

文字コード 30・3F・7A に偶数パリティを付ける

7 ビットの文字コードの先頭に 1 ビットの偶数パリティビットを付加するとき,文字コード 30,3F,7A にパリティビットを付加したものはどれか。ここで,文字コードは 16 進数で表している。

ア 30,3F,7A
イ 30,3F,FA
ウ B0,3F,FA
エ B0,BF,7A

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

解き方と答えを見る
  1. 30 を2進数にする:3=011、0=0000 → 011 0000。1の個数は 2個(偶数)
  2. 偶数パリティなので、すでに偶数ならパリティは 0 → 0011 0000 = 30 のまま
  3. 3F を2進数にする:3=011、F=1111 → 011 1111。1の個数は 2+4=6個(偶数)→ パリティ 0 → 3F のまま
  4. 7A を2進数にする:7=111、A=1010 → 111 1010。1の個数は 3+2=5個(奇数)
  5. 全体を偶数にするため、パリティ 1 を先頭に付ける → 1111 1010 = FA(上の桁 7+8=F と考えてもよい)
  6. 結果は 30,3F,FA。選択肢と照らし合わせる

答え:イ(30,3F,FA)

例題 2

「ET」をASCIIで表し、偶数パリティを付けて16進数にする

文字列 “ET” を ASCII でコード化したものを 16 進表記したものはどれか。ここで,文字コードの 8 ビット目には,偶数パリティビットが付く。
〔ASCII コード表の一部〕 列見出し(上 3 行が b7, b6, b5 の値): 左の列 b7=1, b6=0, b5=0 / 右の列 b7=1, b6=0, b5=1(※図では b7→1行目,b6→2行目,b5→3行目に矢印で対応)
b4b3b2b1b7b6b5=100b7b6b5=101
0000@P
0001AQ
0010BR
0011CS
0100DT
0101EU
0110FV
0111GW

ア 4554
イ A32B
ウ ACA5
エ C5D4

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

解き方と答えを見る
  1. 表から E の位置を読む:b7b6b5=100、b4b3b2b1=0101 → 100 0101 = 16進数で 45
  2. E の1の個数:1+0+0+0+1+0+1=3個(奇数)→ パリティ 1 を8ビット目に付ける → 1100 0101 = C5
  3. 表から T の位置を読む:b7b6b5=101、b4b3b2b1=0100 → 101 0100 = 16進数で 54
  4. T の1の個数:1+0+1+0+1+0+0=3個(奇数)→ パリティ 1 → 1101 0100 = D4
  5. つなげると C5D4。パリティを付けていない 4554(ア)を選ばないよう注意する

答え:エ(C5D4)

例題 3

奇数パリティで常に成り立つXORの式を選ぶ

8 ビットのレジスタがある。このレジスタの各ビットの値を d0,d1,…,d7 とし,パリティビットの値を p とする。奇数パリティの場合,常に成立する関係式はどれか。ここで,⊕ は排他的論理和演算を表す。

ア 0 ⊕ d0 ⊕ d1 ⊕ … ⊕ d7 = p
イ d0 ⊕ d1 ⊕ … ⊕ d7 = p
ウ d0 ⊕ d1 ⊕ … ⊕ d7 ⊕ p = 0
エ d0 ⊕ d1 ⊕ … ⊕ d7 ⊕ p = 1

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

解き方と答えを見る
  1. 奇数パリティの決まり:d0〜d7 と p を合わせた全体の1の個数は必ず奇数
  2. XORで全ビットをつなぐと、1の個数が奇数なら結果は 1 になる
  3. したがって d0 ⊕ d1 ⊕ … ⊕ d7 ⊕ p = 1 が常に成り立つ
  4. ウ(=0)は偶数パリティの式。イは「p=データのXOR」で、これも偶数パリティの付け方
  5. アは 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ビット検出」と書かれた選択肢はハミング符号の説明で、垂直パリティではない。
CRC Cyclic Redundancy Check(巡回冗長検査)
ビット列を生成多項式で割った余りを付けて送り、受信側で割り切れるかどうかで誤りを検出する方式。
⚠ パリティは1の個数を数える方式で、割り算をしない。ハミング符号は訂正もできる。
生成多項式 せいせいたこうしき
CRCで、送信側と受信側があらかじめ決めておく「割る数」にあたるビット列。
排他的論理和(XOR) はいたてきろんりわ(Exclusive OR)
2つのビットが異なれば1、同じなら0を返す演算。多くのビットをつなぐと、1の個数が奇数なら1になる。
⚠ 論理和(OR)は、どちらかが1なら1になる。1⊕1=0 になる点が違う。
ASCIIコード American Standard Code for Information Interchange
英数字や記号を7ビットで表す文字コードで、8ビット目をパリティに使うことがある。
バースト誤り ばーすとあやまり
連続した複数のビットがまとめて反転する誤り。
⚠ パリティは偶数個の誤りを見逃すため、バースト誤りの検出にはCRCが向いている。

このレッスンの過去問

このレッスンで稽古する