目录
4位二进制的减法
补码系统
🧠减基补码
名字解释:
减基补码有什么用?
计算方法
❓为什么这样就能计算减基补码
💡 原理揭示:按位减法,模拟总减法!
那对于二进制呢?(b = 2)
🧠 基补码
名字解释:
计算方法
❓ 为什么用基补码就可以实现减法运算?
什么是模 b^n 运算?
回顾逻辑链条
完整比较表:减基补码 vs 基补码
4位二进制的减法
我们用这个4位二进制的减法例子:
A = 1000(即十进制的 8)
B = 0001(即十进制的 1)
我们希望计算:A - B = 1000 - 0001 = ?
借位时:
-
从左边借一个
1
,即从第二位借变成1 → 0
-
当前位变成
2
(二进制中的 10)
上面的减法需要手动借位,非常繁琐,而且不适合电路实现。为了解决这个问题,引入了补码数制,使减法变成加法。
补码系统
对于任意进制为 b 的数字系统,存在两种常用的补码定义,用来表示负数、简化减法:
-
(b−1)’s complement(减基补码):用于模拟借位操作
-
b’s complement(基补码):常用于计算机系统,能将减法直接变为加法
在任意进制 b 中,对一个非负数 N 的补码,我们关心的是:
怎么用某个“补”的方式,表示 “−N”,从而让:
这和二进制补码的思想完全一致,但现在是推广到任意进制 b。
🧠减基补码
(中文:减基补码 / 英文:Diminished Radix Complement)
名字解释:
-
“b”:表示进制(base),比如十进制是 10,二进制是 2
-
“b−1”:是进制的最大一位数字
-
十进制里是 9
-
二进制里是 1
-
-
“complement”:英文意思是“补码”或“补数”,意思是某种“差值”
-
所以你可以理解为:
减基补码,就是“对每一位,求它距离最大位值(b−1)的差”
这就是“按位取反”的来源。
所以:
对于任意进制为 b 的数字系统,给定一个 n 位非负数 N,它的减基补码是:
换句话说:
-
我们在“最大可能的数值”上(即 b^n - 1)减去当前数
-
或者更直观地说:
将每一位数字都用 (b−1) 减去它自己
减基补码有什么用?
它主要用于:将减法转化为加法
我们可以这样写:
比如:
-
73 - 25
可以用补码方式计算为:
最后结果取最后两位:48 ✅
(这个“只保留低位”在计算机中称为模运算)
计算方法
-
确定当前进制 b,以及数的位数 n
-
将每一位数字用 b−1减去它
-
得到的新数就是减基补码
✴️ 例子 :十进制(b = 10)
我们来求 372 的 9’s complement
因为 10 − 1 = 9,所以是 9's complement
步骤:
-
原数:
3 7 2
-
每位做:
9 - 3 = 6
,9 - 7 = 2
,9 - 2 = 7
-
结果:
627
❓为什么这样就能计算减基补码
补码(complement)的目的是:
让我们在“不会借位”的前提下完成减法
也就是说:我们希望能把减法 A − B
,变成 A + 某个东西
,而这个“某个东西”要能代表“负的 B”。
怎么代表 “负的 B”?
假设我们工作在一个固定长度的进制系统中:比如在十进制里,用 3 位数 ⇒ 最大值是 999
所以,整个空间就是从 000 到 999
在这种情况下: - B = 1000 - B
这是 “基补码” b’s complement = b^n - B (后面会提到)
那么:
核心公式解释:
给你一个 3 位数 B = 372
,我们想知道怎么快速得到:
999 - 372 = ?
是不是需要手动减法?太麻烦了!
有没有一种快速的方法呢?有的!
💡 原理揭示:按位减法,模拟总减法!
来看看:
原数位 | 3 | 7 | 2 |
---|---|---|---|
减去 | 9 | 9 | 9 |
得到 | 6 | 2 | 7 |
你有没有发现?
我们是把 999 - 372,拆成了逐位相减的操作
即:(9 - 3)(9 - 7)(9 - 2) = 627
那我们为什么可以这样逐位减?
我们再来深入看一下:
这是减基补码的核心定义:
✅ “(b^n - 1) − N” 是什么?
它是一个固定数(最大值)减去当前值
我们从数学角度知道:
-
总差值 = 每位差值之和(如果没有进位或借位)
那我们就直接把每一位单独处理,从高位到低位,做:
b−1 - 当前位数字
这个方法就能快速等价于“总值减当前数”。
这就是我们所谓的:
把每一位都用最大可能的数减去它自己,省略了进位借位的麻烦。
那对于二进制呢?(b = 2)
-
最大每位就是 1
-
所以:
1 - 当前位
就是“取反”:
原数 | 0101 |
---|---|
取反 | 1010 |
所以:
在二进制里,(b−1)'s complement 就是“反码(Ones’ Complement)”
减基补码的缺点
问题 | 说明 |
---|---|
有两个“零” | 000...0 表示 +0 ,但 999...9 (或 111...1 )表示 -0 ❌ |
需要手动加1 | 加法后还要再加1,麻烦 |
不如 b’s complement(基补码)方便 | b’s complement 是在它基础上改进的,更常用 |
🧠 基补码
b’s complement,中文叫“基补码”,英文全称是 Radix Complement,
是一种用于减法运算或表示负数的编码方式,适用于任何进制 b。
名字解释:
部分 | 含义 |
---|---|
b | 表示“进制”(base),例如:十进制 b=10,二进制 b=2 |
complement | 英文中意为“补码”、“补数” |
Radix Complement | “radix” 就是“进制”的正式英文术语,直译就是“进制的补数” |
给定一个 n 位的正整数 N,它的基补码是:
也可以理解为:
先求减基补码((b−1)’s complement),然后再加 1:
计算方法
步骤1:确认进制 b 和位数 n
(比如十进制 3 位,最大值就是 b^n = 1000)
步骤2:用公式 b^n - N
✴️ 例子 :二进制(b = 2)
求 0101
(十进制 5)的 2’s complement(也就是我们熟悉的补码)
-
先按位取反(就是 1’s complement):
0101 → 1010
再加 1:
1010 + 1 = 1011
✅ 所以:
2’s complement of 0101 = 1011
这就是我们熟悉的“取反 + 加 1”,它其实就是 2’s complement。
❓ 为什么用基补码就可以实现减法运算?
设定场景:我们处在一个有限数字空间里
我们假设一个 固定长度为 n 位的数字系统,进制为 b。
-
总共能表示的数有:
0 到 b^n - 1 (比如:3 位十进制是 000 到 999)
在这种系统下,所有加法、减法,其实都发生在一个“圈”里。这在数学中叫作模 b^n 算术(modulo arithmetic)。
什么是模 b^n 运算?
任何计算超出这个范围,就“回绕”回来。
就像时钟是模 12 的系统:
同理,十进制 3 位系统是模 1000 的系统:
我们希望把 A − B 变成 A + something
我们的问题是:
如何让 A − B
,变成 A + ???
?
用模运算思维,我们知道:
因为:
这就是我们最核心的逻辑:
在模 b^n 意义下,负数 −B 可以表示成 b^n - B
所以你只要:
-
不直接做 A − B
-
而是把 B 换成 b’s complement(即 b^n - B),再和 A 相加
-
最后把结果取模(保留低 n 位)
你就等价于完成了 A − B 的操作!
举个完整例子说明
用十进制,3 位(即模 1000)
设:
-
A = 100
-
B = 25
-
A − B = 75(目标)
我们来用 b’s complement 做:
-
b’s complement of 25 = 1000 − 25 = 975
-
A + 975 = 100 + 975 = 1075
-
1075 mod 1000 = 75 ✅
完全等价!
回顾逻辑链条
-
我们想把减法变成加法,是因为计算机更容易做加法(电路简单)
-
所以要找到一种方式,把 “-B” 表示成一个“加数”
-
在模 b^n 的世界里:
-
所以:
-
而 b^n - B 就是 b’s complement of B
-
所以,我们通过补码的方式,就能完成减法!
完整比较表:减基补码 vs 基补码
项目 | (b−1)’s Complement(减基补码) | b’s Complement(基补码) |
---|---|---|
英文术语 | Diminished Radix Complement | Radix Complement |
表达式 | (b^n - 1) - N | b^n - N |
本质意义 | 每位用 (b−1) 减去原位数 | 在 (b−1)’s complement 基础上再加 1 |
是否等价于负数 −N(模意义) | 否,除非尾进位补偿 | ✅ 是 |
是否适应进位(carry) | ❌ 不能直接使用,需要“尾进位回加” | ✅ 自动处理进位 |
减法实现方式 | A + (b−1)’s complement(B) + 1,或加后尾加进位 | A + b’s complement(B),直接做 |
是否容易硬件实现 | ❌ 难(因需判断进位) | ✅ 易(适合加法器) |
是否存在两个“0” | ✅ 有:0000 和 9999(或 1111) | ❌ 只有一个“0” |
二进制特例 | 1’s complement(反码) | 2’s complement(补码) |
是否常用于现代计算机 | ❌ 否(仅历史背景) | ✅ 是(普遍使用) |
易读性 | ✅ 简单按位减 | ❌ 稍复杂,需要加1 |