補数

del.icio.us del.icio.us
Digg Digg
Furl Furl
Reddit Reddit
Rojo Rojo
Add to OnlyWire

補数ほすう)とは、ある基数法において、ある自然数 a に足して桁が1つ上がるような最小の数のことを言う。

目次

定義

N進法において、自然数 a 以上となる最小の N の冪乗 を M とする。

  • M-a が 「N進法における a に対する N の補数」である。
  • M-a-1 が 「N進法における a に対する (N-1) の補数」である。

つまり、

  • N進法において、a に足して全体の桁が1つ上がるような最小の自然数を「N進法における a に対する N の補数」という。
  • N進法において、a に足しても桁が上がらない最大の自然数を「N進法における a に対する (N-1) の補数」という。

N の補数という用語における N は N の冪乗から引くことを指すのに対し、(N-1) の補数という用語における (N-1) は、実質的には (N-1) を並べたものから引くことを意味する。

N の補数を基数の補数、(N-1) の補数を減基数の補数と呼ぶこともある。

N進法、N の補数及び (N-1) の補数という用語は、実際には通常 N に具体的な数値を代入して用いられる。例えば、N = 10の場合、「10 進法における 10 の補数」及び「10 進法における 9 の補数」の如くである。

「N 進法における」との表現はしばしば省略される。しかし、そのような省略を用いると、「βの補数」が (β+1)進法における減基数の補数と、β進法における基数の補数のいずれを指すのか曖昧になることがある。これらの値は必ずしも等しくない。例えば、「9 の補数」は、10進法における減基数の補数と 9 進法における基数の補数のいずれを指すのか不明である。これは英語では、例えば nines' complement と nine's complement のように書き分けて一応の区別が可能であるが(Knuthの文献を参照)、日本語ではいずれも「9 の補数」と表現せざるを得ない。実際には、N は大抵の場合 10 か 2 であり、その限りでこれが深刻な問題となることは少ないとはいえ、このような省略は、β進法の基数の補数と(β+1)進法の減基数の補数が異なる概念であるということを分かりにくくしていると言えよう。基数の補数及び減基数の補数の用語の組み合わせにはこのような意味での曖昧さはない。

なお、通常は、補数といえば N の補数 又は (N-1) の補数を指すため、本項では「補数」と「N の補数」等を厳密に区別していないが、補数という用語を、単に、定められた数 M からある数 a を引いた数と定義し、ここで定義した N の補数などと区別する用語法もある。

利点

基数の補数を負の数の表記法として採用すると、最上位桁からの桁上がり(桁あふれ・オーバーフロー)を無視すれば、通常の加算処理で負の数の加算(つまり正の数の減算)が行えることになる。

この利点のため、2の補数は多くのコンピュータで負の数の内部表現に採用されている。 当然、この利点は10進数でも利用できる。以下に例を示す。

 52934-38917
=52934-(99999-61082)   … (1) 61082は38917の9の補数(簡単な数字の置き換えで求まる)
=52934-(100000-61083)  … (2) 61083は38917の10の補数(1を加える)
=(52934+61083)-100000  … (3) 5桁の減算が、5桁の加算に変形された。
=114017-100000         … (4) 最後に、ごく単純な減算をすればよい。
=14017

実際の計算機では、2進数での同等な処理を行う際、(2)の1の加算を、通常の加算では使用しない最下位桁の桁上がり信号を利用し(3)の加算と同時に計算できるため、1回の減算は、1回の加算と同コストとなる。

計算法

自然数 a の N進法による表記の各桁が、1の位から順に

a0, a1, ..., ar-1, ar

であるとする(ただし、arは0でないものとする)。ここで、各 bi を次のように定義する。

bi = (N-1)-ai

このとき、N進法における各桁が

b0, b1, ..., br-1, br

であるような数 b が 「 a に対する (N-1) の補数」である。

また、このとき b+1 が「 a に対する N の補数」である。

10進法での例

10進法で 2304671 と表される数に対する補数を求める。 9-2=7, 9-3=6, 9-0=9, 9-4=5, 9-6=3, 9-7=2, 9-1=8 より、9の補数は 7695328 である。

7695328+1 = 7695329 だから、10の補数は 7695329 である。

2進法での例

2進法の場合は 1-1=0, 1-0=1 であるから、1の補数を求めるには単純に 1 と 0 を入れ替えればよい。

2の補数を求めるには、1の補数に1を加算するとよい。

  • 2進法 101010110 と表される数に対する1の補数は 010101001 である。
  • 2の補数は 010101001+1 = 010101010 である。

参考文献

JIS X 0005:2002 情報処理用語(データの表現) 05.08

Donald E. Knuth 『The Art of Computer Programming Vol. 2 Seminumerical Algorithms Third Ed. 日本語版』 アスキー、2004年、191頁。 (ISBN 4-7561-4543-4)

関連項目

This article is from Wikipedia. All text is available under the terms of the GNU Free Documentation License.


Giant Panda

Mercedes Car
James Bond Guide
This site monitored by SitePinger.net