コンピュータは2進数を用いて計算するとため、引き算のときに2の補数を用いることは、よく知られています。情報工学の教科書には、一般に、n進数には、nの補数と、n-1の補数があることの説明がありますが、数学的に丁寧な説明がなされているものが少ないのが現状です。
そこで、補数について、丁寧に説明してある数学の教科書又は専門書を教えてください。
具体的な書名でなくとも、補数とは、数学のこの分野に属するため、当該分野の本を読め、という回答でも結構です。
No.4ベストアンサー
- 回答日時:
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 を加える」という簡単な処理になります。
「有限桁数の計算における桁あふれ」のずるい(賢い)利用ということです。
*****************************
訂正した全文は以上です。
何度も混乱させてスミマセン。
No.7
- 回答日時:
分野としては、整数論とか離散数学になるのでは。
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の補数を用いること」は、よくありますが、全てがそうであるわけではありません。
No.6
- 回答日時:
No.5
- 回答日時:
補数は単純なので丁寧な説明というのはないでしょうね。
例えば、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
No.3
- 回答日時:
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 の補数」と呼ぶということです。
No.2
- 回答日時:
そんな、本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 を加える」という簡単な処理になります。
「有限桁数の計算における桁あふれ」のずるい(賢い)利用ということです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 情報処理技術者・Microsoft認定資格 2進数の問題を教えてください。 1 2022/07/27 09:42
- 数学 【大至急】数学のレポートの問題なんですが分からないので是非教えていただきたいです!本当にお願いします 5 2022/07/25 06:52
- その他(コンピューター・テクノロジー) 量子コンピュータの動作原理がわかりません。同じビットが、1でも0でも有って良いだろうか? 3 2023/02/04 03:20
- 計算機科学 2進数の計算について 2進数の値は全て8ビットで負数は2の補数形式とする。結果が8ビットで表現出来な 3 2023/07/22 14:08
- C言語・C++・C# C言語 3 2022/10/04 15:07
- 国家公務員・地方公務員 公務員試験の数的処理で苦戦しています。 1 2023/01/30 08:56
- 計算機科学 ビット計算 2 2023/04/16 14:26
- その他(教育・科学・学問) 小学生の算数の商について 3 2023/03/06 14:11
- 数学 中一数学の【最大公約数と最小公倍数】の問題です。 1問だけでも教えていただけると嬉しいです。 (1) 4 2022/08/01 10:19
- 中学校 中3の数学の問題の四季と計算の利用という分野の問題がいくつか分かりません 助けてくださいm(_ _) 2 2022/05/05 21:23
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
循環小数を分数にする方法
-
3÷7のあまりは「3」ですか?
-
エクセル:6E-05という表現は?
-
2進数の割り算が分かりません...
-
数学の階乗はどんな時に使うの...
-
数字3桁の組み合わせの何通り...
-
数値とアルファベットに分ける...
-
【場合の数】 2桁の自然数で、2...
-
3分の1とは何パーセントでしょ...
-
5個の数字0、1、2、3、4を使っ...
-
3桁の数字は何通りですか?
-
0.120は有効数字何桁ですか? ...
-
7で割ると3余り、9で割ると4余...
-
Excelでの有効数字の合わせ方に...
-
100!
-
です。 0.008020 の有効数字は...
-
定数が入る場合の有効数字
-
一億引く百が苦手なめい
-
筆算(引き算)の教え方は?
-
10進数で123を2進数で表わすと...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
2進数の割り算が分かりません...
-
エクセル:6E-05という表現は?
-
数字3桁の組み合わせの何通り...
-
数値とアルファベットに分ける...
-
60進法と10進法
-
3÷7のあまりは「3」ですか?
-
NUMBER(N,M) としたときの、格...
-
電話番号のハイフンの入れ方
-
EXCELで10万未満切捨ての...
-
数学の階乗はどんな時に使うの...
-
エクセル関数で桁数指定し数値...
-
です。 0.008020 の有効数字は...
-
関数電卓の表示方法を変更したい
-
3分の1とは何パーセントでしょ...
-
0以下の数字は何桁?
-
10進法の数を60進法の数に...
-
エクセルのsumifの検索値
-
【場合の数】 2桁の自然数で、2...
-
0.120は有効数字何桁ですか? ...
-
10進数で123を2進数で表わすと...
おすすめ情報