補数
出典: フリー百科事典『ウィキペディア(Wikipedia)』
補数(ほすう)とは、ある基数法において、ある自然数 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+100000-38917-100000 … (1) 式をこのように変形してみる = 52934+1+(99999-38917)-100000 = 52934+(1+61082)-100000 … (2) 61082 は 38917 の 9の補数(簡単な数字の置き換えで求まる) = 52934+61083-100000 … (3) 61083 は 38917 の 10の補数(9の補数+1) = 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)

