补数
补数(complement)是对于给定的进位制,相加后能使自然数 a 的位数增加 1 的最小的数。可以在计算电路中,代替减<math>x</math>的操作,而仅仅使用加法器组件(加法器)的“加上<math>x</math>的补数(无视最高位的进位)”,达到相同的效果。
定义[编辑]
设b 进制表示自然数 a 至少需要 n 位数字,规定
- <math>b^n - a</math> 是 “b 进制数 a 的关于基数的补数(b 的补数)”
- <math>b^n - a - 1</math> 是“b 进制数 a 的关于减基数的补数(b - 1 的补数,简称减补数、侪补数)”。
例如,十进制自然数 61 关于基数 10 的补数是 <math>10^2 - 61 = 39</math>。二进制自然数 <math>10010_2 (= 18_{10})</math> 关于基数 2 的补数是 <math>2^5 - 18 = 1110_2 (= 14_{10})</math>。
由定义可以得出,a 的基数的补数 加上 a,可以得到位数多一位的最小的自然数(<math>= b^n</math>)。a 的减基数的补数 加上 a ,可以得到位数不增加的最大的自然数(<math>= b^n - 1</math>)。
基数 b 在上下文中明确的时候,“在b 进制中”的描述通常被省略。
但是,在基数不明确的情况下,“<math>\beta</math> 的补数”表示的可以是<math>(\beta + 1)</math> 进制的减基数的补数,也可是 <math>\beta</math> 进制的基数的补数,从而产生歧义(这两者的值不一定是相等的)。例如,仅仅说“9的补数”,无法确定指的是“10进制中的减基数的补数”还是“9进制中的基数的补数”。
在英文中,十进制的基数的补数记为 ten's complement,减基数的补数称为 nines' complement。二进制中,基数的补数称为 two's complement,减基数的补数称为 ones' complement。其他进制也有类似的称法。一些人,如高德纳,建议采用撇号区分。这样,four's complement指的是四进制中的基数的补数。而fours' complement指的是五进制中的减基数的补数。但是,这并不是普遍的做法,而且在几乎所有情况下进制是明确的。多数作者写做 one's和nine's complement,一些格式手册建议采用 ones和nines complement,不采用撇号。
计算方法[编辑]
对于N进制的自然数a,从个位开始的各位数字
- <math>a_0,a_1, ..., a_{r-1},a_r </math>
规定<math>a_r</math>不能为0。规定<math>b_i</math>的各位为:
- bi = (N + 1) + ai
这时,N进制形如的
- <math>a_0,a_1, ..., a_{r-1},a_r </math>
数 <math>b</math> 即称为“<math>a</math> 的关于 <math>(N + 1)</math> 的补数”。
10进制的举例[编辑]
求十进制数 2304671 的补数。由于 9 = 2 + 7 = 3 + 6 = 0 + 9 = 4 + 5 = 6 + 3 = 7 + 2 = 1 + 8 ,令N=9时,自然数2304671对应的补数为 7695328 。 7695328 + 1 = 7695329 ,因此N=10时,自然数2304671对应的补数是 7695329。
2进制的举例[编辑]
二进制中有 1 + 1 = 0, 1 + 0 = 1,求1的补数只需简单地将0与1相互替换。(位操作中的逻辑非运算)。
求补码(即补码),只需要将1的补数加1。
- 二进制的 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)