プロが教える店舗&オフィスのセキュリティ対策術

コンピュータは2進数を用いて計算するとため、引き算のときに2の補数を用いることは、よく知られています。情報工学の教科書には、一般に、n進数には、nの補数と、n-1の補数があることの説明がありますが、数学的に丁寧な説明がなされているものが少ないのが現状です。
そこで、補数について、丁寧に説明してある数学の教科書又は専門書を教えてください。
具体的な書名でなくとも、補数とは、数学のこの分野に属するため、当該分野の本を読め、という回答でも結構です。

A 回答 (7件)

No.2です。

ああ、読み返したら、「ある数」だの「逆転数」が混乱していましたね。(最初に書いた「ある数」が、偶然にも左右対称の補数関係になっていたので、途中で変更して、最初のところを訂正し忘れた)
いっそのこと、No.3の訂正も含めて、全文訂正して再掲します。

************************

そんな、本1冊を要するような難しいものではありません。

何進法でもよいのですが、たとえば10進法なら、

 ある数:493,583

があったときに、各桁の数を「n進法」の「n - 1」である「9」から引いて「逆転数」を作ります。

 ある数:493,583
   ↓
 逆転数:506,416 ←説明不要でしょうが、9-4, 9-9, 9-3, 9-5, 9-8, 9-3 です。

この「逆転数」が「(n-1) の補数」です。

  「ある数」+「逆転数」= 999,999   ①

になるのはわかりますか? 当たり前ですよね、そうやって「逆転数」を作ったのですから。

 だったら、それに「+1」したら

  「ある数」+「逆転数」+ 1 = 1,000,000   ②

となるのも分かりますよね?

 ここで「6桁どうしを加算して 1 を加えたら、7桁の数になって、下の6桁は全て 0 になった」というのがミソです。
 コンピュータでは、「最大m桁までの数しか扱えない」という制約で情報を処理しますから、上のような m=6 のときには「7桁目の 1 は消えてしまう」のです。つまり、コンピュータ上では

  「ある数」+「逆転数」+ 1 = 000,000   ③

という処理になってしまいます。「桁あふれ」による「ビット落ち」「情報落ち」ということですが、これを逆手にとって、「引き算」に利用しているのです。

 ③を移項すれば
   「逆転数」+ 1 = 000,000 -「ある数」= -「ある数」(本当は 1,000,000 -「ある数」)
になります。

 これは「ある数」の負数を作りたければ、「『逆転数 = (n-1) の補数』に 1 を加えればよい」(これを「n の補数」と呼ぶ)ということを示しています。
 つまり
   N - 「ある数」= N + 「逆転数」+ 1 = N + 「 『ある数』の (n-1) の補数」+ 1
  = N + 「 『ある数』の n の補数」
という計算をすればよいということです。
 「 『ある数』の (n-1) の補数」は、あらかじめ決めた「有効桁」で行います。上の式の計算を数学的に計算すれば、この「有効桁」の1つ上の桁に「1」が桁上がりしますが、それは「桁あふれ」として棄却することが条件です。

 これは何進法でも成立します。

 コンピュータでは、これを「2進数」で、「負数は、1の補数に 1 を加えたもの」(これを「2進数」の「2の補数」)として扱います。「減算」は「負数の加算」ですから、「2の補数」の加算で実行できることになります。
 「2進数」の「1の補数」は、有効桁全体で「0 と 1 とを逆転する」ことで得られますから、「負数は、有効桁全体で「0 と 1 とを逆転」して 1 を加える」という簡単な処理になります。
 「有限桁数の計算における桁あふれ」のずるい(賢い)利用ということです。

*****************************

訂正した全文は以上です。
何度も混乱させてスミマセン。
    • good
    • 2
この回答へのお礼

丁寧に、手取り足取り教えてくださって、誠にありがとうございました。有効桁数の計算における桁あふれの話は、目から鱗が落ちました。

お礼日時:2016/12/30 17:45

分野としては、整数論とか離散数学になるのでは。



2の補数表現を使った演算は、合同式の性質を応用したものです。
https://ja.wikipedia.org/wiki/%E6%95%B4%E6%95%B0 …
https://ja.wikibooks.org/wiki/%E5%88%9D%E7%AD%89 …


余談ですが、「コンピュータは2進数を用いて計算するとため、引き算のときに2の補数を用いること」は、よくありますが、全てがそうであるわけではありません。
    • good
    • 1
この回答へのお礼

合同式の性質を応用したものとのご教示、ありがとうございます。ご案内いただいた分野を勉強してみます。

お礼日時:2016/12/30 17:49
    • good
    • 1
この回答へのお礼

ありがとうございます。ご紹介いただいた書籍を読んでみます。

お礼日時:2016/12/30 17:47

補数は単純なので丁寧な説明というのはないでしょうね。



例えば、32 の100の補数は 100 - 32 = 68
補数とは補って(足して)切りのいい数になるかずです。
それだけ。

で、50 - 32 = 50 + 68 - 100 = 118 - 100 = 18
だから、補数を求めておけば足し算で引き算が
できます。この場合2桁たの計算で2桁の補数を使うから
100を引くのがコツ。

2進数で2の補数というのは、n桁の2進数で 2^n の補数をとること。
2進数で1の補数というのは、n桁の2進数で 2^n-1 の補数をとること。

2進数で1の補数は、求める電子回路を簡単に作れます。
1の補数に1を足せば2の補数なので簡単に求まります。
2の補数が手に入れば、引き算を足し算に置き換えることが
可能になり、工学的に回路を省略出来て経済的です。

例4桁の場合 5 -3 = 0101(2)-0011(2)を計算
#(2)は2進を表す。

0011(2) の1の補数は ビット反転して 1100(2)
0011(2) の2の補数は2の補数に1足して 1101(2)

0101(2)-0011(2) = 0101(2)+1101(2) - 10000(2)
= 10010(2) - 10000(2) = 10(2) = 2
    • good
    • 1
この回答へのお礼

とても丁寧に教えてくださってありがとうございます。

お礼日時:2016/12/30 17:46

No.2です。

すみません、ちょっと調べたら、『単なる「補数」』の呼び名の説明が少し違っていたようなので、訂正します。

○No.1でいうところの「逆転数 + 1」を、その「n進数」における「n の補数」と呼び、それを単に「補数」と呼ぶことがある

ということのようです。従って、

「(「n-1」を付けずに、単に「補数」と呼ぶことも多い)」

という記述は削除し、

「(これを「n の補数」と呼ぶかなあ?)」

「(これを「n の補数」と呼ぶ)」

に訂正してください。

 また、2進数だけでなく、任意の「n進数」で同様な統一的な呼び方をするようですので、下の方の「2進数に限って」という条件も削除してください。


 以上を10進数の「ある数:497,316」(有効桁は6桁)に適用すると

  1,000,000 - 497,316 = 502,684

が「10 の補数」(または単に「補数」)であり、各桁を「9」から引いた「逆転数」

  502,683

を「9 の補数」と呼ぶということです。
    • good
    • 0

そんな、本1冊を要するような難しいものではありません。



何進法でもよいのですが、たとえば10進法なら、

 ある数:497,316

があったときに、各桁の数を「n進法」の「n - 1」である「9」から引いて「逆転数」を作ります。

 ある数:493,583
   ↓
 逆転数:506,416 ←説明不要でしょうが、9-4, 9-9, 9-3, 9-5, 9-8, 9-3 です。

この「逆転数」が「(n-1) の補数」です。(「n-1」を付けずに、単に「補数」と呼ぶことも多い)

  「ある数」+「逆転数」= 999,999   ①

になるのはわかりますか? 当たり前ですよね、そうやって「逆転数」を作ったのですから。

 だったら、それに「+1」したら

  「ある数」+「逆転数」+ 1 = 1,000,000   ②

となるのも分かりますよね?

 ここで「6桁どうしを加算して 1 を加えたら、7桁の数になって、下の6桁は全て 0 になった」というのがミソです。
 コンピュータでは、「最大m桁までの数しか扱えない」という制約で情報を処理しますから、上のような m=6 のときには「7桁目の 1 は消えてしまう」のです。つまり、コンピュータ上では

  「ある数」+「逆転数」+ 1 = 000,000   ③

という処理になってしまいます。「桁あふれ」による「ビット落ち」「情報落ち」ということですが、これを逆手にとって、「引き算」に利用しているのです。

 ③を移項すれば
   「逆転数」+ 1 = 000,000 -「ある数」= -「ある数」(本当は 1,000,000 -「ある数」)
になります。

 これは「ある数」の負数を作りたければ、「『逆転数 = (n-1) の補数』に 1 を加えればよい」(これを「n の補数」と呼ぶかなあ?)ということを示しています。
 つまり
   N - 「ある数」= N + 「逆転数」+ 1 = N + 「 『ある数』の (n-1) の補数」+ 1
という計算をすればよいということです。
 「 『ある数』の (n-1) の補数」は、あらかじめ決めた「有効桁」で行います。上の式の計算を数学的に計算すれば、この「有効桁」の1つ上の桁に「1」が桁上がりしますが、それは「桁あふれ」として棄却することが条件です。

 これは何進法でも成立します。

 コンピュータでは、これを「2進数」で、「負数は、1の補数に 1 を加えたもの」(「2進数」に限って、これを「2の補数」と呼ぶことが多い)として扱います。「減算」は「負数の加算」ですから、「2の補数」の加算で実行できることになります。
 「2進数」の「1の補数」は、有効桁全体で「0 と 1 とを逆転する」ことで得られますから、「負数は、有効桁全体で「0 と 1 とを逆転」して 1 を加える」という簡単な処理になります。
 「有限桁数の計算における桁あふれ」のずるい(賢い)利用ということです。
    • good
    • 0

Wikipediaの『補数』の説明では不十分?


数学的に丁寧な説明として何を期待しているのでしょう。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!