プロが教えるわが家の防犯対策術!

10進数における補数の求め方は、絶対値同士を加算し桁が上がりする関係を持つ数が補数です。
-1の補数を求めるときは、-1の絶対値である1に9を加算することで10となるので、-1の補数は、9です。
2進数における補数の求め方は、数値を反転し、下一桁目に1を加算することです。

合っているか自信はないのですが、10進数、2進数の補数の求め方は、分かったのですがそれ以外のn進数における補数の求め方は、10進数と2進数のようにばらつきがあるのでしょうか。
それとも、何か共通の求め方があるのでしょうか。n進数の補数の求め方を教えてください。

質問者からの補足コメント

  • ご回答有難うございます。本当に毎回とても助かっております。
    重ね重ね申し訳ないのですが、

    >>補数は減算を加算して...<中略>質問に書かれている「負数の補数」というのは...
    というのは、例えば「5-3」という計算式の-3を「7」として扱う、つまり5+7にするということですか。
    負数の補数に関しては下記のサイトを参考にしたわけですが、-3の補数が7とあったので、お互いを加算し10になるのが補数なのだと思ったので-1の補数は9と書いたのですが、tknakamuri氏の回答を見る限りどうも間違っていたようです。
    http://itpro.nikkeibp.co.jp/members/ITPro/ITBASI …

    No.2の回答に寄せられた補足コメントです。 補足日時:2016/10/04 20:16
  • ご回答有難うございます。おかげさまで理解が深まったような気がします。
    式を教えていただけたことで前進できそうです。

    >>10進3桁の1の補数は 10^3-1 = 999。
    3桁の1は、「001」ということですか。

    >>10進の4桁目の桁上りを無視するシステムでは、
    >>8 + 999 = 7
    4桁目を削除するので1007ではなく007、つまり7ということだと思うのですが、8+999の8と7は、どういう意味をもっていますか。

    No.3の回答に寄せられた補足コメントです。 補足日時:2016/10/04 20:22
  • ご返答有難うございます。「補数」と「補数表現」で意味が全く違うのですね。読解力が無くitproが記述された内容では読み取ることができませんでした。本当に助かります。

    >>3の補数が7 で
    絶対値を使って説明するときに「補数」、
    >>7は-3の補数表現
    負を含んだ数値を使って説明するときが「補数表現」という言葉を使うということなのでしょうか。

    No.5の回答に寄せられた補足コメントです。 補足日時:2016/10/05 17:18
  • どう思う?

    ご回答有難うございます。
    >>このようなシステムでは
    >>0 →0, 1→1、2→2, 3→3, 4→4
    >>5→-5. 6→-4, 7→-3, 8→-2, 9 →-1
    9の補数は、1で、その9の補数である1は、-9の補数表現
    なので0 →-10, 1→-9、2→-8, 3→-7, 4→-6ではないのでしょうか。
    間違っておったらすみません。

    No.6の回答に寄せられた補足コメントです。 補足日時:2016/10/12 17:36
  • どう思う?

    ご回答有難うございます。
    申し訳ありませんが質問させてください。

    ①aより大きくないと計算してはならない?
    >>X + (-a)<中略>ということがわかります。
    この計算式に数値を当てはめてみても文章のようにいきません。
    aに9、aの補数に1(9の補数)を当てはめるとX+(-9)、X+1となります。
    Xに5を当てはめると5+(-9)=-4、5+1=6で、同じ結果にならないのです。ただ、aである9より大きい数字で計算するとおっしゃる通り同じ結果になります。10+(-9)=1、10+1=11(1)のように。aより大きい数字で計算するのが正解なのでしょうか。

    >> 0〜(((n^m)/2)-1)を「そのまま」、((n^m)/2)〜((n^m)-1) を「負の補数表現」>>に割り振ります。
    n^m-aと似ていますが上記の式は、何を求める式なのでしょうか。

    No.8の回答に寄せられた補足コメントです。 補足日時:2016/10/17 19:51
  • 何度もご回答有難うございます。大変助かります。

    >>「 10進一桁の世界」 に 「マイナス」記号を持ち込んではいけません。
    式の...+(-9)におけるマイナスは、持ち込んでもよいのでしょうか。それとも式は、"気にせず"に結果である-4だけを補数に変換するのでしょうか。

    >>合同式
    合同式は、ネットで調べたところ、除算と余の式だと書いてありました。
    x ≡y(mod n)は、nでxとyを割ると余りが両方とも同じになるもの、x-yがmod nの倍数となる、ということは覚えました。

    No.9の回答に寄せられた補足コメントです。 補足日時:2016/10/19 17:40

A 回答 (9件)

「補数」と、「補数(を使った負数の)表現」と、「実際の運用」とを分けて考えてください。



10進法1桁では、足して10になる(1桁なので溢れた分を無視して0になる)数を「補数」とよびます。
※ 正確には、 10進法1桁における「10の補数」
0の補数は0(10だと2桁になるので)
1の補数は9
2の補数は8
3の補数は7
4の補数は6
5の補数は5
6の補数は4
7の補数は3
8の補数は2
9の補数は1

n進法m桁なら、 aの「nの補数」は n^m - a です。
補数には、それ以上の意味はありません。
「負数」とは無関係です。


数学で
a + b = 0
のとき、
b = -a
となります。
a=1 なら b=-1 です。

ここで、10進法1桁の世界を考えます。
a=1, b = 9 (1の補数) と考えると
a + b = 0 (10の桁溢れを無視)
これを、マイナス記号のある世界の数学に対応させると
b = -a 、すなわち、 9(1の補数) = -1 となります。( = の意味が本来とは違ってきます)
同様に、n進法m桁の世界では、
X + (-a)

X + aの補数
と同じ結果になる、ということがわかります。

この性質に注目して、「マイナス記号のある世界の負数 -a」は「マイナス記号の無い世界の aの補数」に置き換える、というのが、「補数を使った負数の表現」です。
マイナス記号のある世界では「マイナス記号を使った負数の表現」を使っていることになります。


マイナス記号の無い世界に 「3」 という答えがあったとします。
では、これをマイナス記号のある世界に持ってきたとき
・そのままの3
・3は7の補数なので、負数である -7 に変換
のどちらになるでしょうか?

これだけでは判断できません。
そこで、予め「そのまま使う値」と「負数を補数表現したものと見做す値」に分けておきます。
0〜4は「そのまま」5〜9は「負数の補数表現」と決めておけば、3は「そのまま」となります。
これは「実際の運用」の話になります。

通常は、上記のように 0〜(((n^m)/2)-1)を「そのまま」、((n^m)/2)〜((n^m)-1) を「負の補数表現」に割り振ります。
※ 特に、2進法で上記のように割り振ると、一番上の桁が0なら「そのまま」、1なら「負の補数表現」と簡単に判断できるようになります。
ですが、目的に合せて「-7〜+2」とかにしてもかまいません。
あくまで「実際の運用」をどうするか、の話です。


「補数を使った負数の表現」は万能ではありません。
例えば -1<1 ですが、 補数表現を使うと 9 > 1 となってしまいます。
9 < 1 と判定させるには、「 9は負数 1は正数、よって 9 < 1 」 といった、通常の数値判定以外の判定手順が必要になります。
そのため「マイナス記号のある世界の負数 -a」を「マイナス記号の無い世界」へ変換する方法はいくつも考えられていて、目的によって使い分けています。

----
そのitproの記事は、簡単に説明するためか、次のようになっています。
・「補数」と「補数を使った負数の表現」の区別がついていない
・負数の表現が「補数を使った負数の表現」しかないような書き方になっている
一般人の豆知識としてはいいですが、より正確に知ろうとするなら、ちょっと不適かと思います。
----
よく、「補数は反転して+1」と説明しているのを見ます。
これは、10進1桁で言うなら
(9 - a) + 1
と計算する、ということです。 9-a が「反転」にあたります。
これは結局
10 - a
を計算するのと同じことだということがわかるかと思います。

コンピュータの場合、通常「ビットを反転する」「+1する」という計算が回路に組込まれていて、真面目に 0 - a と引き算するより、「反転」「+1」とした方が効率がいい場合があります。

これは、計算を楽にするためのテクニックの話しです。
「反転」「+1」 は補数とは直接関係はありません。

「2進法のビット反転」を、相当するn進法の引き算にすることで、n進法でも同様のテクニックが使えます。
実際に、10進法8桁での補数を
・100000000 - 82 で計算
・99999999 - 82 を計算して +1 する
の2通りで筆算してみてください。
前者は繰下げが沢山あって面倒なのに比べて、後者は簡単だと実感できるはずです。

なお、この「反転」の値を、n進法m桁における「(n-1)の補数」と呼びます。
この回答への補足あり
    • good
    • 3

> 5+(-9)=-4



「 10進一桁の世界」 に 「マイナス」記号を持ち込んではいけません。
この場合、「 -4 」は「 4の補数=6 」にする必要があります。


> n進法m桁の世界では、X + (-a) は X + aの補数 と同じ結果になる

これは、数学では
X + (-a) ≡ X + 「aの補数」 (mod n^m)
と表現できるのですが、「合同式」ってわかりますか?



② 上記の式は、何を求める式なのでしょうか。
→ 実際に、n と m に適当な値を入れて計算してみてください。
単に、 n進m桁で表現できる値を2つに分けただけです
この回答への補足あり
    • good
    • 0

>9の補数は、1で、その9の補数である1は、


>-9の補数表現なので0 →-10, 1→-9、
>2→-8, 3→-7, 4→-6ではないのでしょうか。

そう考えても実用性ないのでやりません。
1が1でもあり―9でもありでは困るだけです。

数学の定義ではなくて、負の数をどう表現するか
という話だということに注意。これは実用のための
ひとつの「取り決め」なのです。
    • good
    • 1

>>>3の補数が7 で


>絶対値を使って説明するときに「補数」、
>>>7は-3の補数表現
>負を含んだ数値を使って説明するときが「補数表現」という言葉を使うという>ことなのでしょうか。

そうといってしまえばそうなんですが、そういう形式的な話ではないです。

例えば・・・、話を10進一桁の数に絞りましょう。
この数のシステムでは、数は

0,1,2,3,4,5,6,7,8,9

の10種類で負の数はありません。

このシステムには、足し算が定義されていて、

1+3=4

などと計算が行えますが、

3+9=12

は12は存在しないので、できません。
そこで、桁上りを無視することとして

3 + 9 = 2

と計算するようになっています。

以上の本来負の数も引き算も存在しないシステムで、

3 + (-2)= 1 あるいは 3 - 2 = 1

というような計算が、システムをそのまま「流用」して
できないか?

というのが負の数を表すのに補数を使うという「アイデア」です。

つまり

-2 の代わりに 8 を使う、8を -2 と見なすことで
負の数、あるいは引き算を実現しようということです。

3+(-2) = 3 + 8 = 1

このようなシステムでは

0 →0, 1→1、2→2, 3→3, 4→4
5→-5. 6→-4, 7→-3, 8→-2, 9 →-1

というように、数を置き換えて考えます。

このとき -3 を 7, -5 を 5 などに対応させる
ことを(負数の代わりに補数を使うことを)、

「負数を補数で表現する」と言います。

ここから、「負数の表現形式に補数を用いる」
というような言い方が生まれます。

ちなみに、蛇足ですが、負数を表す表現形式は
補数だけではありません。
この回答への補足あり
    • good
    • 1

>>>10進の4桁目の桁上りを無視するシステムでは、


>>>8 + 999 = 7
>4桁目を削除するので1007ではなく007、
>つまり7ということだと思うのですが、8+999の8と7は、
>どういう意味をもっていますか。

まず、-3の補数が 7 というように、itProの記事に書いてあった
とおっしゃってますが、そうではなくて、

-3 の補数表現が 7

が正しいですよね。これは全然意味が違う。

10進一桁の場合、

3の補数が7 で
7は-3の補数表現

です。

この意味の違いをよく考えましょう。

4桁目の繰上りを無視するシステムでは

8 + 999 = 7

となりますが、これは

8 + (-1) = 7

と同じ、つまり、999が (-1) と同じ役割をはたして
います。これが 999 が -1 の「補数表現」の意味です。

999 は 1 の補数です。
この回答への補足あり
    • good
    • 1

No.2です。

「補足」に書かれたことについて。

>負数の補数に関しては下記のサイトを参考にしたわけですが、-3の補数が7とあったので、お互いを加算し10になるのが補数なのだと思ったので-1の補数は9と書いたのですが、tknakamuri氏の回答を見る限りどうも間違っていたようです。

はい、違っています。
「各桁ごとに」そうするのではなく、「有効桁」最大数についてそうするのです。

「-3の補数が7」というのは「有効桁が1桁の場合」の話です。
「桁あふれを無視する」のは「有効桁の上の桁」ですることなので、「補数」の議論をするときには、「有効桁」を決めて議論しないと成り立ちません。
「各桁」ごとの数値処理ではなく、「有効桁」の数での処理ということです。

tknakamuri氏の回答も、そういうことを言っているのです。
「n進数m桁での a の補数は n^m-a (a ≧0)」というのは、「有効桁が m桁の n進数」ということです。
    • good
    • 1

>n進数における補数の求め方は、


>10進数と2進数のようにばらつきがあるのでしょうか。

全部同じで違いはありません。10進でも2進でも同じ

n進数m桁での a の補数は n^m-a (a ≧0)

これだけです。


10進3桁での 111 の補数は 10^3-111= 1000-111=889

2審で3桁での 011(2進表現)=3(10進表現) の補数は
101 (2進表現)=5(10進表現)

つまり 2^3 -3 = 8 - 3 = 5

が補数です。全く同じやり方ですよね?

ちなみに -1 の補数という表現は変。
補数とは正しかない数で定義するもので、
計算機システムでは補数と桁あふれの無視を利用して
補数を負の数とみなします。

例えば、
10進3桁の1の補数は 10^3-1 = 999。

10進の4桁目の桁上りを無視するシステムでは、
8 + 999 = 7

となるので 1の補数 999 を -1 と「みなす」ことができます。
この回答への補足あり
    • good
    • 1

通常出て来る 2進数の「補数」とは、「減算」を「加算」で行うためのものです。

「補数」とはそういう位置づけのものとして考えます。
 従って、質問に書かれている「負数の補数」というのは、何のことかわからないので、ここでは「正数」の補数について書きます。

  2進数では、「1の補数」とは、相互に加算すると全桁が「1」(「1111・・・・1111」)になるもので、それに「1」を加えれば全桁が桁上がりして、最上桁で「桁あふれ」して、見かけ上「有効桁がすべて0になる」というものです。この「1の補数」に「1を加えたもの」が「2の補数」です。

 つまり、補数をとりたい数値 A に対して、B を「1の補数」とすると、「B + 1」が「2の補数」となって
  A + (B + 1) = 0
となるので、このBを B + 1 = -A と定義して、「Aとの減算」を「(B + 1) との加算」とするのです。

 N進法でいえば、「(N-1) の補数」とは、相互に加算すると全桁が「N-1」(「XXXX・・・・XXXX」: X=N-1)になるもので、それに「1」を加えれば全桁が桁上がりして、最上桁で「桁あふれ」して、見かけ上「有効桁がすべて0になる」というものです。この「(N-1) の補数」に「1を加えたもの」が「N の補数」です。

 2進数の場合には、各桁が「0か1」しかありませんので、補数を取りたい数値の「0と1をひっくり返す」で済みますが、これは「有効桁数全体の「1111・・・・1111」から、補数を取りたい数値を引く」という操作をしているのです。

 同様に、10進数 A の補数とは、有効桁数全体の「9999・・・・9999」と A との差をとり、それに「+1」したもの、ということになります。従って、各桁の数値で見れば、「9からその桁の数値を引く」という操作になります。

 さらに同様に、n進数 A の補数とは、有効桁数全体の「XXXX・・・・XXXX」(X=n-1)と A との差をとり、それに「+1」したもの、ということになります。この場合にも、各桁の数値で見れば、「(n - 1) からその桁の数値を引く」という操作になります。
この回答への補足あり
    • good
    • 1

何言ってるのかよくわかりませんが。


補数って何でしょうか。

>絶対値同士を加算し桁が上がりする関係を持つ数が補数です。
じゃあ[100]の補数は、[899]と[-899]の2つあるんですか?おかしいですよね。

>2進数における補数の求め方は、数値を反転し、下一桁目に1を加算することです。
いわゆる「2の補数」「減基数の補数」ってやつを指してますか。

2進数の場合「反転」で済むのは使う数字が2個しかないからです。1の他は0だけだし
0の他は1だけだから。

正しくは、
10進数なら、その数を、同じ桁数の「9並びの数」引いて1を加えたもの
です。
n進数なら、その数を、同じ桁数の「n-1並びの数」引いて1を加えたもの
ということ。

>n進数の補数の求め方を教えてください。
その数字の桁数の最大値-その数字+1です。簡単なこと。
    • good
    • 0

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