
チェックサムと補数【高校情報Ⅰ・基本情報技術者】
■■動画解説■■
情報Ⅰ共通テスト対策 書籍出版します!
■資料ダウンロード■
情報教育の底上げが目的なので、資料を修正して、
学校・塾(営利目的含む)の授業等で利用して頂いて問題ありません。
私への連絡不要ですが、利用する際には、
YouTubeチャンネル・情報Ⅰ動画教科書・IT用語動画辞典を
紹介してもらえると嬉しいです。
https://toppakou.com/info1/download/99_資料/16_補数とチェックサム.pptx
■■文字おこし■■

コンピュータのデータ転送は、0と1の電気的信号に置き換えられて相手に届いたら、
人間の目に見える形に組み立てなおされます。
電気信号だから、途中何らかの理由でノイズが入り、内容が変化したり、一部が欠損したりする可能性があります。
今日は、もしデータが変化してしまった場合に誤りを検出できる、チェックサムという方法を説明していきます。
チェックサムを説明する前に、事前知識として補数というものを説明します。

補数は足すと1桁増える最も小さな数のことになります。
よくわからないと思うのでまずは、10進法の例でみていきましょう。
例えば 9は1プラスすると10となり1桁繰り上がります。
この時、9に対する補数は1となります。
98の場合は2プラスすると100となり1桁繰り上がります。
この時98に対する補数は2となります。
この10進法で表した足すと1桁上がる補数のことを10の補数と言います。
では、次は2進法の2の補数を説明していきます。

考え方は同じです。
例えば2進法で表される数の1の場合
1をプラスすると10となり1桁繰り上がります。
ですので補数は1となります。
2桁で考えましょう。
10の場合、は10が補数となります。検算していきましょう
1桁目は0+0で0、2桁目は1+1で2進法では10となり、100となり1桁繰り上がりました。
11でも1桁繰り上がりますが、最小値としては10なので補数は10となります。
コンピュータの世界はあらかじめ桁数が決められていて、ゼロ埋めすることが多いです。
例えば8ビットの00101101の補数を考えていきましょう。

この時点でお手上げの方が多いと思いますが、2の補数を簡単に求める方法があります。
はじめに0と1とを反転して、反転した値に1をプラスします。
実際にやっていきましょう。
0と1を反転させて
11010010 となります。
それに1をプラスして。
1101 0011となり、これが補数となります。
本当に桁が繰り上がるか検算していきましょう。
00101101
11010011
1桁目は1+1で10なので0となり、2桁目に繰り上がりの1を持ってきます。
2桁目は持ってきた1と0と1を足して10なので0なので3桁目に繰り上がりの1を持ってきます。あとは同じことを各桁で繰り返すと、100000000となり、1桁繰り上がっていることが分かります。
2の補数は先頭1ビットをプラスかマイナスの符号として使う場合もありますが、
今回のチェックサムではその考えは使わないので、補数を使った加減算はまた別動画で説明します。

チェックサムは、エラー検出のアルゴリズムやそのエラーチェックの際に使用する値のことです。
送信データを分割し 、そのデータの和であるチェックサムの補数をデータに追加して送信します。
受け手側は、受け取ったデータの和つまりチェックサムから補数を求め送られてきたデータに付与されているチェックサムの補数と突き合わせ、一致していればデータに誤りがないことを確認できます。

具体的な数値で試していきましょう。
8ビットを1セットとして合計16ビットのデータがあります。
まず、そのデータを加算します。
この値をチェックサムと言います。
そしてそのチェックサムの補数を求めます。
先ほど説明したように0と1を反転して1をプラスします。
そのデータを相手に送信します。
受け取った相手側は同じように、8ビット単位の合計を求め、その補数を求めます。
それが送られてきた補数と一致するかをチェックします。
仮にデータが何らかの影響で変化した場合は、送られてきたチェックサムの補数と一致しないので、データに何らかの誤りがあることが検知できます。
----------
応用編として、文字列の送信として16進法で考えていきましょう。

Hoという文字を送信するとします。
文字コードはASCIIコードを使います。
大文字のHは16進法のASCIIコードで48となります。
小文字のoは16進法のASCIIコードで6Fとなります。
まずチェックサムを求めます。
48+6Fの16進法の足し算をします。
8+Fは 10進法では8+15となり23となります。
16進法は16を1つの繰り上がりの単位としますので。16進法表記にするために、
すだれ算で16で割っていくとで17となります。
2桁目の4と6足すと10進法基準では10ですが、16進法だとAになります。
1けための7はそのままおろしてきて2桁目は1+Aは10進法で11となり16進法ではBとなります。
よってチェックサムは16進法ではB7となります。
補数を求めるために2進法にします。
Bは10進法で11 2進法変換の為すだれ算を使うと1011となります。
16進法の7は10進法でも7ですが、2進法変換の為すだれ算を使って2で割っていくと、0111となります。
求めた値の0と1とをひっくり返します。
0100 1000となります。
それに1をプラスすると
0100 1001 となり
16進法表記にすると 49となります。
よってHoの送信データは16進法表記では
486F チェックサムの補数は49となります。
送信データが変化することもありますが、チェックサム自体も変化する可能性があります。
どちらにしても、送信されてきたチェックサムの補数と不一致となるのでチェックサムの補数も含め何らかの誤りがあることが検出できます。

チェックサムと似たような言葉に
チェックデジットという言葉があります。
どちらもデータをチェックするための付帯情報という意味では同じです。
チェックサムは送るデータを区切ってビット列を全て足したものという決まりがありますが。
チェックデジットは決まりはなくデータをチェックするために付与する数字や記号で意味は幅広いです。
例えば会員番号等 下一桁以外全ての桁を掛け合わせてその一桁目をチェック用として付与する等、システムを作る側でルールが決められます。
データ送信に限らず、例えば会員番号を人の手で入力するときなど入力誤りのチェックなどでも使われます。
この違いも押さえておきましょう。
今日は以上になります。最後までご視聴ありがとうございました。